将泛型接口的实现分配给属性

本文关键字:属性 分配 实现 泛型接口 | 更新日期: 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只出现在接口的输出位置时,它才会起作用(在您显示的代码中就是这样,但我不知道它是否是您的真实代码)。