泛型类型约束构造函数的限制,需要建议
本文关键字:约束 构造函数 泛型类型 | 更新日期: 2023-09-27 18:28:07
我正试图根据为创建所述类的实例而传递的类型参数,在类的构造函数中实例化一个对象。
public class DefaultController<TEntity, TStrategy> : ApiController, IDisposable where TEntity : class, IEntity where TStrategy: BaseStrategy<TEntity>
{
public IStrategy<TEntity> strategy { get; set; }
public DefaultController()
{
//strategy = ??
}
}
这是BaseStrategy
public abstract class BaseStrategy<TEntity> : IStrategy<TEntity> where TEntity : class, IEntity
{
private IRepository<TEntity> repository;
public BaseStrategy(IRepository<TEntity> _repository)
{
repository = _repository;
}
//implements a bunch of methods...
}
正如您所看到的,BaseStategy
没有无参数构造函数,这使得无法在DefaultController
中使用new()
通用约束
我试图实现的是,从一个扩展DefaultController
的类中,配置使用的策略
public class UserController : DefaultController<User, GreatStrategy<User>>
{
// GreatStrategy extends BaseStrategy
}
有什么变通方法可以让魔法发挥作用,或者其他方法?
谢谢。
DefaultController需要无参数构造函数是有原因的吗?你可以试试:
public DefaultController(IStrategy<IEntity> strategy) : base(strategy)
{
// Do stuff
}
然后在你的UserController构造函数中:
public UserController() : base(new GreatStrategy<User>()) {
// Do stuff
}
您的应用程序中是否使用IoC?如果是这样,您可以注册策略并将它们注入控制器构造函数,这样您就不必在基构造函数调用中启动新的策略。
希望这能给你一些前进的指导。
我最终修改了默认控制器和所有扩展它的控制器的构造函数:
public DefaultController(IStrategy<TEntity> _strategy)
{
strategy = _strategy; // 'strategy' is a local member implementing IStrategy...
}
扩展默认控制器的控制器有一个构造函数,比如:
public class UserController : DefaultController<User>
{
public UserController()
: base (new GreatStrategy<User>(new Repository<User>()))
{
//GreatStrategy extends BaseStrategy...
}
}