泛型类型约束构造函数的限制,需要建议

本文关键字:约束 构造函数 泛型类型 | 更新日期: 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...
    }
}