不同的Generics T在同一个系列中

时间:2012-05-15 18:45:21

标签: c# generics

public abstract Column<T>
{
   private T Value {get;set;}    

   public abstract string Format();

}

public class DateColumn : Column<DateTime>
{
   public override string Format()
   {
      return Value.ToString("dd-MMM-yyyy");
   }
}

public class NumberColumn : Column<decimal>
{
   public override string Format()
   {
      return Value.ToString();
   }
}

我遇到的问题是将这些添加到通用集合中。我知道它可能但我怎么能在集合等中存储多种类型

IList<Column<?>> columns = new List<Column<?>()

我真的很感激有关实现这一目标的任何建议。目标是将不同的列类型存储在同一个List中。值得一提的是我使用NHibernate和鉴别器来加载适当的对象。最后,Value需要具有类的类型。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:16)

为了将List<T>存储在一起,列必须具有公共基本类型。最接近的公共基类DateColumnNumberColumnobject。既不是源自Column<T>,而是来自Column<T>的特定且不同的实例化。

此处的一个解决方案是引入Column派生的非通用Column<T>类型,并将其存储在List

public abstract class Column { 
  public abstract object ValueUntyped { get; }
}

public abstract class Column<T> : Column {
  public T Value { get; set; }
  public override object ValueUntyped { get { return Value; } }
}

...

IList<Column> list = new List<Column>();
list.Add(new DateColumn());
list.Add(new NumberColumn());

答案 1 :(得分:3)

泛型是关于指定类型的。如果您想使用动态类型,请改用经典ArrayList

答案 2 :(得分:3)

从非泛型Column类派生可能是有意义的,该类包含尽可能多的列的非泛型公共接口...然后将列表声明为List<Column>