通用接口列表
如果我有一个带有几个实现类的通用接口,例如:
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
-
虽然后者可能不是你所追求的(你的界面即使在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 () { Type t = typeof(T); return this._elements.ContainsKey(t) ? this._elements[t].Cast>() : Enumerable.Empty (); } }