Ambil kelas berikut sebagai contoh:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Saya kemudian ingin membuat contoh jenis ini menggunakan refleksi:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Biasanya ini akan berfungsi, namun karena SomeType
belum mendefinisikan konstruktor tanpa parameter, panggilan ke Activator.CreateInstance
akan memunculkan pengecualian tipe MissingMethodException
dengan pesan " Tidak ada konstruktor parameterless yang ditentukan untuk objek ini. " Apakah ada cara alternatif untuk tetap membuat turunan dari jenis ini? Akan agak menyebalkan untuk menambahkan konstruktor tanpa parameter ke semua kelas saya.
FormatterServices.GetUninitializedObject
tidak memungkinkan untuk membuat string yang tidak diinisialisasi. Anda mungkin mendapatkan pengecualian:System.ArgumentException: Uninitialized Strings cannot be created.
Harap perhatikan hal ini.Jawaban:
Saya awalnya memposting jawaban ini di sini , tetapi ini adalah cetakan ulang karena ini bukan pertanyaan yang persis sama tetapi memiliki jawaban yang sama:
FormatterServices.GetUninitializedObject()
akan membuat sebuah instance tanpa memanggil konstruktor. Saya menemukan kelas ini dengan menggunakan Reflektor dan menggali melalui beberapa kelas serialisasi inti .Net.Saya mengujinya menggunakan kode contoh di bawah dan sepertinya berfungsi dengan baik:
sumber
Gunakan kelebihan metode CreateInstance ini:
Lihat: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
sumber
Ketika saya membandingkan kinerjanya
(T)FormatterServices.GetUninitializedObject(typeof(T))
lebih lambat. Pada saat yang sama, ekspresi terkompilasi akan memberi Anda peningkatan kecepatan yang luar biasa meskipun hanya berfungsi untuk tipe dengan konstruktor default. Saya mengambil pendekatan hybrid:Ini berarti ekspresi create di-cache secara efektif dan dikenakan penalti hanya saat pertama kali jenis dimuat. Akan menangani jenis nilai juga dengan cara yang efisien.
Sebut saja:
Perhatikan bahwa
(T)FormatterServices.GetUninitializedObject(t)
akan gagal untuk string. Oleh karena itu penanganan khusus untuk string dilakukan untuk mengembalikan string kosong.sumber
Jawaban bagus tetapi tidak dapat digunakan pada kerangka kompak dot net. Berikut adalah solusi yang akan bekerja pada CF.Net ...
sumber