Katakanlah saya memiliki anggota generik di kelas atau metode, jadi:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Ketika saya instantiate kelas, T
menjadi MyTypeObject1
, sehingga kelas memiliki properti daftar generik: List<MyTypeObject1>
. Hal yang sama berlaku untuk metode generik di kelas non-generik:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Saya ingin tahu, jenis objek apa yang terdapat dalam daftar kelas saya. Jadi daftar properti yang dipanggil Bar
atau variabel lokal baz
, berisi jenis apa T
?
Saya tidak bisa melakukannya Bar[0].GetType()
, karena daftar mungkin berisi elemen nol. Bagaimana saya bisa melakukannya?
object
,IList
, atau serupa - tapi ini bisa sangat baik menjadi jawaban yang tepat.typeof
. Jika Anda ingin mengetahui tipe T, gunakan sajatypeof(T)
:)typeof()
parameter generik. Apakah Anda punya contoh di mana itu tidak akan berhasil? Atau apakah Anda membingungkan parameter dan referensi tipe?(catatan: Saya berasumsi bahwa yang Anda tahu adalah
object
atauIList
atau serupa, dan bahwa daftar bisa menjadi semua jenis saat runtime)Jika Anda tahu itu adalah
List<T>
, maka:Pilihan lain adalah melihat pengindeks:
Menggunakan TypeInfo baru:
sumber
Dengan metode ekstensi berikut, Anda dapat keluar tanpa refleksi:
Atau lebih umum:
Pemakaian:
sumber
T
waktu kompilasi. Dalam hal ini, Anda tidak perlu kode sama sekali.ItemType
Mencoba
sumber
GetGenericArguments
metode mengembalikan objek ArrayType
, yang Anda perlu kemudian menguraikan posisi Tipe Generik yang Anda butuhkan. SepertiType<TKey, TValue>
: Anda harusGetGenericArguments()[0]
mendapatkanTKey
tipe danGetGenericArguments()[1]
mendapatkanTValue
tipeItu bekerja untuk saya. Di mana myList adalah semacam daftar yang tidak diketahui.
sumber
<T>
)List
sudah merupakan implementasi dariIEnumerable
, jadi para pemain sepertinya tidak menambahkan apa-apa. Tapi terima kasih, ini solusi yang bagus.Jika Anda tidak memerlukan variabel Type keseluruhan dan hanya ingin memeriksa tipe Anda dapat dengan mudah membuat variabel temp dan gunakan operator.
sumber
Anda dapat menggunakan yang ini untuk jenis kembali daftar umum:
sumber
Pertimbangkan ini: Saya menggunakannya untuk mengekspor 20 daftar yang diketik dengan cara yang sama:
sumber
new T();
akan melakukan hal yang sama(T)Activator.CreateInstance(typeof(T));
. Memang mengharuskan Anda menambahkanwhere T : new()
ke definisi kelas / fungsi, tetapi jika Anda ingin membuat objek, itu harus tetap dilakukan.GetType
padaFirstOrDefault
entri mengakibatkan pengecualian referensi null potensial. Jika Anda yakin itu akan mengembalikan setidaknya satu item, mengapa tidak menggunakannyaFirst
?Saya menggunakan metode ekstensi ini untuk mencapai sesuatu yang serupa:
Anda menggunakannya seperti ini:
Ini bukan yang Anda cari, tetapi sangat membantu dalam menunjukkan teknik yang terlibat.
sumber
The
GetGenericArgument()
Metode harus diatur pada Basis Jenis Misalnya Anda (yang kelasnya adalah kelas generikmyClass<T>
). Jika tidak, ia mengembalikan suatu tipe [0]Contoh:
sumber
Anda bisa mendapatkan jenis "T" dari semua jenis koleksi yang mengimplementasikan IEnumerable <T> dengan yang berikut:
Perhatikan bahwa itu tidak mendukung tipe pengumpulan yang mengimplementasikan IEnumerable <T> dua kali, misalnya
Saya kira Anda dapat mengembalikan berbagai jenis jika Anda perlu mendukung ini ...
Selain itu, Anda mungkin juga ingin men-cache hasil per jenis koleksi jika Anda sering melakukan ini (misalnya dalam satu lingkaran).
sumber
sumber
Menggunakan solusi 3dGrabber:
sumber
Jika Anda ingin mengetahui jenis yang mendasari properti, coba ini:
sumber
Beginilah cara saya melakukannya
Lalu panggil seperti ini
ATAU
sumber
Tipe:
sumber
SingleOrDefault()
juga melemparInvalidOperationException
ketika ada dua atau lebih elemen.