通用类型约束构造函数限制,需要建议

Generic type constraint constructor limitation, need advice

我正在尝试根据传递的类型参数在 class 的构造函数中实例化一个对象,以创建上述 class.

的实例
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() 泛型约束

我想要实现的是,从 class 扩展 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...
    }

}