Saya menggunakan refleksi untuk mengulangi Type
properti a dan mengatur tipe tertentu ke default. Sekarang, saya bisa melakukan saklar pada jenis dan mengatur default(Type)
secara eksplisit, tetapi saya lebih suka melakukannya dalam satu baris. Apakah ada program yang setara dengan standar?
c#
reflection
default
tags2k
sumber
sumber
Jawaban:
Dalam versi .net yang lebih baru seperti standar .net,
type.IsValueType
perlu ditulis sebagai .nettype.GetTypeInfo().IsValueType
sumber
default(T) != (T)(object)default(T) && !(default(T) != default(T))
kemudian Anda memiliki argumen, jika tidak maka tidak masalah apakah itu kotak atau tidak, karena mereka setara.default(T) != default(T)
return salah, dan itu curang! =)Array.CreateInstance(type, length)
.Mengapa tidak memanggil metode yang mengembalikan default (T) dengan refleksi? Anda dapat menggunakan GetDefault jenis apa pun dengan:
sumber
nameof(GetDefaultGeneric)
jika Anda bisa, alih-alih"GetDefaultGeneric"
Anda bisa menggunakannya
PropertyInfo.SetValue(obj, null)
. Jika dipanggil pada tipe nilai itu akan memberi Anda default. Perilaku ini didokumentasikan dalam. NET 4.0 dan .NET 4.5 .sumber
Jika Anda menggunakan .NET 4.0 atau di atas dan Anda menginginkan versi program yang bukan kodifikasi aturan yang didefinisikan di luar kode , Anda dapat membuat
Expression
, mengkompilasi, dan menjalankannya sambil jalan.Metode ekstensi berikut akan mengambil
Type
dan mendapatkan nilai yang dikembalikan daridefault(T)
melaluiDefault
metode diExpression
kelas:Anda juga harus men-cache nilai di atas berdasarkan pada
Type
, tetapi perlu diketahui jika Anda memanggil ini untuk sejumlah besarType
contoh, dan jangan menggunakannya terus-menerus, memori yang dikonsumsi oleh cache mungkin lebih besar daripada manfaatnya.sumber
e.Compile()
. Itulah inti dari ekspresi.e.Compile()
harus di-cache, tetapi dengan asumsi bahwa, metode ini kira-kira 14x lebih cepat untuk misalnyalong
. Lihat gist.github.com/pvginkel/fed5c8512b9dfefc2870c6853bbfbf8b untuk patokan dan hasil.e.Compile()
bukane.Compile()()
? mis. Bisakah suatu tipe default berubah pada saat runtime? Jika tidak (seperti yang saya yakini), Anda dapat menyimpan cache hasil daripada ekspresi yang dikompilasi, yang seharusnya meningkatkan kinerja lebih lanjut.Mengapa Anda mengatakan obat generik tidak tersedia?
sumber
Ini adalah solusi Flem yang dioptimalkan:
sumber
return type.IsValueType ? typeDefaults.GetOrAdd(type, Activator.CreateInstance) : null;
Jawaban yang dipilih adalah jawaban yang baik, tetapi hati-hati dengan objek yang dikembalikan.
Mengekstrapolasi ...
sumber
Ekspresi dapat membantu di sini:
Saya tidak menguji cuplikan ini, tetapi saya pikir itu harus menghasilkan null "diketik" untuk jenis referensi ..
sumber
"typed" nulls
- jelaskan. Objek apa yang kamu kembalikan? Jika Anda mengembalikan objek bertipetype
, tetapi nilainya adalahnull
, maka ia tidak - tidak dapat - memiliki informasi lain selain itunull
. Anda tidak dapat memintanull
nilai, dan mencari tahu tipe apa yang seharusnya. Jika Anda TIDAK mengembalikan nol, tetapi kembali .. Saya tidak tahu apa .., maka itu tidak akan bertindak sepertinull
.Tidak dapat menemukan sesuatu yang sederhana dan elegan dulu, tetapi saya punya satu ide: Jika Anda tahu jenis properti yang ingin Anda atur, Anda dapat menulis sendiri
default(T)
. Ada dua kasus -T
adalah tipe nilai, danT
merupakan tipe referensi. Anda dapat melihat ini dengan memeriksaT.IsValueType
. JikaT
merupakan tipe referensi, maka Anda cukup mengaturnyanull
. JikaT
adalah tipe nilai, maka itu akan memiliki konstruktor tanpa parameter default yang dapat Anda panggil untuk mendapatkan nilai "kosong".sumber
Saya melakukan tugas yang sama seperti ini.
sumber
Setara dengan jawaban Dror tetapi sebagai metode ekstensi:
sumber
Penyesuaian sedikit ke solusi @Rob Fonseca-Ensor : Metode ekstensi berikut ini juga berfungsi pada .Net Standard karena saya menggunakan GetRuntimeMethod alih-alih GetMethod.
... dan unit test yang sesuai untuk mereka yang peduli tentang kualitas:
sumber
sumber
Nullable<T>
tipe: itu tidak mengembalikan yang setara daridefault(Nullable<T>)
yang seharusnyanull
. Jawaban yang diterima oleh Dror bekerja lebih baik.Ini seharusnya bekerja:
Nullable<T> a = new Nullable<T>().GetValueOrDefault();
sumber