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

Jon*_*han 9 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

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

IList<Column<?>> columns = new List<Column<?>()
Run Code Online (Sandbox Code Playgroud)

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

非常感谢您的帮助.

Jar*_*Par 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());
Run Code Online (Sandbox Code Playgroud)

  • 您也可以考虑接口而不是基类. (5认同)