我有一个界面
public interface IStrategy<T> where T : BaseModel
{
T GetModel(Guid userId);
}
Run Code Online (Sandbox Code Playgroud)
和一个继承接口的具体类,指定它应该是一个 ConcreteModel
public class ConcreteStrategy: IStrategy<ConcreteModel>
{
ConcreteModel GetModel(Guid userId) { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在在下面的方法中,我可以传递一个新的实例,ConcreteStrategy一切正常
public class Manager
{
public TModel GetContentModel<TModel>(IStrategy<TModel> strategy, Guid userId)
where TModel : ModelBase
{
return strategy.GetContentModel(userId);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将它分配给这样的属性,我会收到错误
public class Strategies
{
public static IStrategy<ModelBase> MyStrategy { get; set; }
}
Strategies.MyStrategy = new ConcreteStrategy();
Run Code Online (Sandbox Code Playgroud)
有没有办法在C#中实现这一目标?我希望能够创建一个工厂方法来封装使用策略的逻辑,并返回某种类型的策略类的实例(如ConcreteStrategy).
我得到的错误是:
无法隐式转换IStrategy<ModelBase>为IStrategy<ConcreteModel>
您需要使您的界面协变:
public interface IStrategy<out T> where T : BaseModel
Run Code Online (Sandbox Code Playgroud)
请注意,它仅在T仅出现在界面的输出位置时才起作用(在您显示的代码中就是这种情况,但我不知道它是否是您的真实代码).