将泛型接口的实现分配给属性
本文关键字:属性 分配 实现 泛型接口 | 更新日期: 2023-09-27 18:24:43
我有一个接口
public interface IStrategy<T> where T : BaseModel
{
T GetModel(Guid userId);
}
以及继承接口的具体类,指定它应该是ConcreteModel
public class ConcreteStrategy: IStrategy<ConcreteModel>
{
ConcreteModel GetModel(Guid userId) { ... }
}
现在,在下面的方法中,我可以传递ConcreteStrategy
的一个新实例,并且一切都正常
public class Manager
{
public TModel GetContentModel<TModel>(IStrategy<TModel> strategy, Guid userId)
where TModel : ModelBase
{
return strategy.GetContentModel(userId);
}
}
但如果我试图将其分配给这样的属性,我会得到一个错误
public class Strategies
{
public static IStrategy<ModelBase> MyStrategy { get; set; }
}
Strategies.MyStrategy = new ConcreteStrategy();
有没有一种方法可以在C#中实现这一点?我希望能够制作一个工厂方法,封装要使用的策略的逻辑,并只返回某种类型的策略类(如ConcreteStrategy
)的实例。
我得到的错误是:
无法将类型IStrategy<ModelBase>
隐式转换为IStrategy<ConcreteModel>
您需要使接口协变:
public interface IStrategy<out T> where T : BaseModel
请注意,只有当T
只出现在接口的输出位置时,它才会起作用(在您显示的代码中就是这样,但我不知道它是否是您的真实代码)。