正确将嵌套类型转换为接口

时间:2018-07-25 19:59:53

标签: c# .net

假设我有一个名为ITranslation的接口和两个实现该接口的类,分别为NameTranslationDescriptionTranslation

interface ITranslation {
    string text { get; set; }
}

class NameTranslation: ITranslation {
  public string text { get; set; }
}

class DescriptionTranslation: ITranslation {
  public string text { get; set; }
}

然后,我希望能够使用它们两者来调用方法。

public void DoStuff(ITranslation) { ... };

上面的方法很好!

假设我重新实现了我的DoStuff方法,以获取接口的通用集合:

public void TryIt()
{
    ICollection<ITranslation> myList = new List<ITranslation>();
    DoStuff(myList);
}
public void DoStuff(ICollection<ITranslation> Param) { }

也很好!

但是当我切换到

ICollection<NameTranslation> myList = new List<NameTranslation>();

C#说它无法投射。

这是为什么?我该如何实现?

我想从ICollection<NameTranslation>转到ICollection<ITranslation>

2 个答案:

答案 0 :(得分:3)

我相信,如果您将DoStuff方法更改为:

 public void DoStuff<T>(ICollection<T> Param) where T : ITranslation { }

将解决您的问题

答案 1 :(得分:0)

您应该像这样对ITranslation进行操作:

ICollection<ITranslation> myList = new List<NameTranslation>();

如果由于某些原因您需要具体名称翻译,而不能使用Icast使用强制转换方法

myList.Cast<ITranslation>.ToList()

或者只是使用泛型进行操作

public void DoStuff<T>(ICollection<T> Param) 
    where T : ITranslation