【问题标题】:Different Generics T in the same collection [duplicate]同一集合中的不同泛型 T [重复]
【发布时间】:2012-05-15 18:45:21
【问题描述】:
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 需要具有类的类型。

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

【问题讨论】:

  • 我对这一点感到困惑。泛型有助于类型安全。无论如何,如果你真的想这样做,你不能用 Column 填充你的列表吗?
  • 不,那行不通,我尝试过使用 Column 我认为问题真的在于通过多态性定义值,然后能够将其存储在集合中。我使用鉴别器来加载不同的列类型。
  • 这个问题已经有a fewduplicates了。除了'base-type'解决方案posted here by JaredPar,我想提出following the adapter pattern to create a non-generic wrapper to this purpose,这样Liskov Substitution Principle就不会被打破。

标签: c# generics


【解决方案1】:

为了一起存储在List&lt;T&gt; 中,列必须具有共同的基本类型。 DateColumnNumberColumn 最接近的公共基类是 object。两者都不是从Column&lt;T&gt; 派生的,而是Column&lt;T&gt; 的特定且不同的实例化。

这里的一个解决方案是引入非泛型 Column 类型,Column&lt;T&gt; 派生自该类型并将其存储在 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());

【讨论】:

  • 你也可以考虑接口而不是基类。
  • 拳击在这里发生。 T 可能是值类型 :(
【解决方案2】:

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

【讨论】:

  • 在这种情况下,我不相信 OP 想要动态类型,而是想要利用基本类型和多态行为
  • 是的,你是对的@JaredPar 我需要解析这些值并试图猜测一个对象是什么是非常困难的。
  • 你说得对,我 +1 了你的详细答案。
【解决方案3】:

从一个非泛型Column 类派生可能是有意义的,该类封装了列的尽可能多的非泛型公共接口...然后将您的列表声明为List&lt;Column&gt;

【讨论】:

  • ...以及@JaredPar 所说的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2011-04-16
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多