我试图使用工厂返回泛型抽象类的实现,以便调用者无需知道返回的具体类型是什么。但是失败了。
public class Car:IMoveable { }
public interface IMoveable { }
public abstract class Service<TEntity>
{
public abstract void PerformService(TEntity t);
}
public class VehicleService : Service<IMoveable>
{
public override void PerformService(IMoveable t) { }
}
public class DefaultService : Service<object>
{
public override void PerformService(object t){ }
}
public static class ServiceFactory
{
public static Service<TEntity> CreateService<TEntity>(TEntity entity) where TEntity : class
{
if (typeof(IMoveable).IsAssignableFrom(typeof(TEntity)))
{
// run time error here as returns null
return new VehicleService() as Service<TEntity>;
//compiler error
return (Service<TEntity>) new VehicleService();
}
else
{
return new DefaultService() as Service<TEntity>;
}
}
}
static void Main(string[] args)
{
var car = new Car();
var service = ServiceFactory.CreateService(car);
}
问题是createService始终为null之后的服务。
我怀疑问题是TEntity作为Car传递,而VehicleService被实现为IMovebale。但是只是无法理解该怎么做,甚至有可能吗?
提前致谢。
您需要通过关键字将TEntity
泛型类型标记Service
为反型in
,并使用基本接口而不是基本抽象类,然后将其强制转换为通用基本类型即可:
public interface Service<in TEntity>
{
void PerformService(TEntity t);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句