12
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 和鉴别器来加载适当的对象。最终,Value 需要具有类的类型。

非常感谢您提前提供的帮助。

4

3 回答 3

21

为了一起存储,List<T>列必须具有共同的基本类型。DateColumn和最接近的公共基类NumberColumnobjectColumn<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());
于 2012-05-15T18:48:27.620 回答
3

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

于 2012-05-15T18:47:45.833 回答
3

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

于 2012-05-15T18:48:03.207 回答