2014-09-26 82 views
4

我有一個接口分配實現通用接口的一個屬性

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>

回答

5

你需要讓你的界面covariant

public interface IStrategy<out T> where T : BaseModel 

注意,它會工作只有當T只出現在界面的輸出位置(這是你已經顯示的代碼的情況,但我不知道它是否你的真實代碼)。