通用接口列表

如果我有一个带有几个实现类的通用接口,例如:

public interface IDataElement { int DataElement { get; set; } T Value { get; set; } } public class IntegerDataElement : IDataElement { public int DataElement { get; set; } public int Value { get; set; } } public class StringDataElement : IDataElement { public int DataElement { get; set; } public String Value { get; set; } } 

是否可以传递不同类型的实现类的集合,而不必诉诸于作为对象传递。

似乎无法将返回值定义为

 public IDataElement[] GetData() 

要么

 public IDataElement[] GetData() 

有什么建议?

你当然可以声明:

 public IDataElement[] GetData() 

 public IDataElement[] GetData() 
  • 虽然后者可能不是你所追求的(你的界面即使在C#4也不会变化,因为它在输入和输出位置使用T ;即使它是变体,你也无法将该方差用于值类型)。 前者将要求调用者指定 ,例如

    foo.GetData();

这对你好吗?

没有办法表达“一个对象集合,每个对象都为不同的T实现IDataElement ”,除非你还给它一个非generics基类,你可以在其中使用IList 。 在这种情况下,非IDataElement可以具有DataElement属性,将Value属性保留在generics接口中:

 public interface IDataElement { int DataElement { get; set; } } public interface IDataElement : IDataElement { T Value { get; set; } } 

这对你的特殊情况有用吗?

目前尚不清楚如何在不知道其类型的情况下使用数据元素的集合……如果上述内容对您没有帮助,也许您可​​以更多地了解您对集合的期望。

不,你不能这样做 – 唯一的选择是使用非通用接口:

 public interface IDataElement { int DataElement { get; set; } object Value { get; set; } } 

或者创建一个包装器并将其传递给知道它们所需类型的方法:

 public class DataElementBag { private IDictionary> _elements; ... public void Add(IDataElement de) { Type t = typeof(T); if(!this._elements.ContainsKey(t)) { this._elements[t] = new List(); } this._elements[t].Add(de); } public void IEnumerable> GetElementsByType() { Type t = typeof(T); return this._elements.ContainsKey(t) ? this._elements[t].Cast>() : Enumerable.Empty(); } }