Pertanyaan Berbagai Generics T dalam koleksi yang sama [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

  • Koleksi tipe generik                     9 jawaban                 
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();
   }
}

Masalah yang saya miliki adalah menambahkan ini ke dalam koleksi generik. Saya tahu itu mungkin tapi bagaimana saya bisa menyimpan beberapa jenis dalam koleksi dll

IList<Column<?>> columns = new List<Column<?>()

Saya sangat menghargai setiap saran untuk mencapai tujuan ini. Tujuannya adalah memiliki tipe kolom yang berbeda yang disimpan dalam Daftar yang sama. Its worth menyebutkan saya menggunakan NHibernate dan diskriminator untuk memuat objek yang sesuai. Pada akhirnya Nilai perlu memiliki jenis kelas.

Terima kasih banyak atas bantuan Anda sebelumnya.


7
2018-05-15 18:45


asal


Jawaban:


Agar dapat disimpan dalam List<T> bersama-sama kolom harus memiliki tipe basis yang umum. Kelas dasar umum terdekat DateColumn dan NumberColumn aku s object. Bukan berasal dari Column<T> tetapi justru instantiasi yang spesifik dan berbeda Column<T>.

Salah satu solusi di sini adalah memperkenalkan non-generik Column ketik yang mana Column<T> berasal dari dan menyimpannya di 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());

15
2018-05-15 18:48



Mungkin masuk akal untuk berasal dari non-generik Column kelas yang membungkus sebanyak antarmuka umum non-generik dari kolom ... kemudian menyatakan daftar Anda sebagai List<Column>.


3
2018-05-15 18:48



Generik adalah semua tentang menentukan jenis. Jika Anda ingin menggunakan tipe dinamis, gunakan klasik ArrayList sebagai gantinya.


2
2018-05-15 18:47