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との最も近い共通基本クラスNumberColumnは ですobject。どちらも から派生するColumn<T>のではなく、 の特定の異なるインスタンス化から派生しますColumn<T>

ここでの 1 つの解決策は、非ジェネリック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 に答える