将不同的泛型存储在单个可枚举中

时间:2012-07-03 18:06:18

标签: c# generics covariance contravariance

给定通用属性类:

public class Attribute<T>
{
  string Name { get; set; }
  T Value { get; set; }
}

有没有办法让一个包含可枚举的对象包含各种类型的泛型(例如int,string,datetime)。

public class AttributableObject
{
  IEnumerable<???> attributes { get; set;}
}

有没有这样做不会遇到差异问题?

1 个答案:

答案 0 :(得分:5)

典型的方法是让泛型类派生自非泛型基类(或接口),然后具有该类型的可枚举:

public abstract class AttributeBase
{
    // Non-generic stuff here
}

public class Attribute<T> : AttributeBase
{
    // Generic stuff here
}

然后你可以声明:

IEnumerable<AttributeBase> attributes;

当然,如果您想使用任何通用功能(例如实际获取值),您仍然需要知道每个元素的类型。

请注意,协方差/逆变在这里没有用,因为Value属性既可设置又可获取,因此泛型参数是不变的(更不用说它是一个通用的,所以无论如何它都不能成为co / contra-variant。)