通用接口列表

ben*_*rce 6 c# generics interface

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

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

public class IntegerDataElement : IDataElement<int>
{
    public int DataElement { get; set; }
    public int Value { get; set; }
}

public class StringDataElement : IDataElement<String>
{
    public int DataElement { get; set; }
    public String Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

是否可以传递不同类型的实现类的集合,而不必求助于作为对象传递.

似乎不可能将返回值定义为

public IDataElement<T>[] GetData()
Run Code Online (Sandbox Code Playgroud)

要么

public IDataElement<object>[] GetData() 
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Jon*_*eet 5

你当然可以声明:

public IDataElement<T>[] GetData<T>()
Run Code Online (Sandbox Code Playgroud)

public IDataElement<object>[] GetData()
Run Code Online (Sandbox Code Playgroud)
  • 尽管后者可能不是您所追求的(即使在 C# 4 中,您的界面也不会变体,因为它T同时用于输入和输出位置;即使它变体,您也无法使用值类型的差异)。前者将要求调用者指定<T>,例如

    foo.GetData<string>();

你这样好吗?

没有办法表达“一个对象的集合,每个对象都实现IDataElement<T>了不同的 T”,除非你还给它一个非泛型基类,在这个基类中你可以只使用IList<IDataElement>. 在这种情况下,非泛型IDataElement可以拥有DataElement属性,将Value属性留在泛型接口中:

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

public interface IDataElement<T> : IDataElement
{
    T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这在您的特定情况下有用吗?

不清楚在不知道数据元素类型的情况下如何使用数据元素集合……如果以上内容对您没有帮助,也许您可​​以多说一下您希望对集合做什么。