同一集合中的不同泛型 T

本文关键字:泛型 集合 | 更新日期: 2023-09-27 18:34:27

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<?>()

我将非常感谢有关实现这一目标的任何建议。目标是在同一列表中存储不同的列类型。值得一提的是,我正在使用 NHibernate 和鉴别器来加载适当的对象。最终,值需要具有类的类型。

非常感谢您的帮助。

同一集合中的不同泛型 T

为了一起存储在List<T>中,列必须具有公共基类型。 DateColumnNumberColumn最接近的公共基类是 object 。 两者都不是从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());

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

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