Bisakah seseorang menjelaskan Activator.CreateInstance()
tujuan secara rinci?
c#
.net
reflection
Tabriz Atayi
sumber
sumber
CreateInstance(Type type)
cocok denganCreateInstance<T>()
kelebihan beban.c#.net
cara melakukannyaObject xyz = Class.forName(className).newInstance();
.Jawaban:
Katakanlah Anda memiliki kelas yang disebut
MyFancyObject
seperti ini di bawah ini:Ini memungkinkan Anda mengubah:
Ke
Menggunakan
dan kemudian dapat melakukan hal-hal seperti:
Itulah tujuannya. Ini juga memiliki banyak kelebihan lainnya seperti memberikan sebagai
Type
ganti nama kelas dalam sebuah string. Mengapa Anda mengalami masalah seperti itu adalah cerita yang berbeda. Inilah beberapa orang yang membutuhkannya:sumber
String ClassName = "My.Namespace.MyFancyObject";
).obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
tetapi alih-alih melakukan casting dengan tipe tersebut. Transmisikan dengan tipe yang terbuat dari ClassName? Seperti iniType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?Saya bisa memberikan contoh mengapa menggunakan sesuatu seperti itu. Pikirkan game di mana Anda ingin menyimpan level dan musuh Anda dalam file XML. Saat Anda mengurai file ini, Anda mungkin memiliki elemen seperti ini.
apa yang dapat Anda lakukan sekarang adalah, membuat objek yang ditemukan di file level Anda secara dinamis.
Ini sangat berguna, untuk membangun lingkungan yang dinamis. Tentu saja juga memungkinkan untuk menggunakan ini untuk skenario Plugin atau addin dan banyak lagi.
sumber
Teman baik saya MSDN dapat menjelaskannya kepada Anda, dengan sebuah contoh
Berikut adalah kode jika tautan atau konten berubah di masa mendatang:
sumber
Anda juga bisa melakukan ini -
sumber
.Unwrap()
tepatnya dan bagaimana hal ini berkaitan dengan solusi lain?CreateInstance
mana ia kembaliSystem.Runtime.Remoting.ObjectHandle
.Contoh yang baik adalah yang berikutnya: misalnya Anda memiliki sekumpulan Logger dan Anda mengizinkan pengguna untuk menentukan jenis yang akan digunakan dalam runtime melalui file konfigurasi.
Kemudian:
ATAU kasus lainnya adalah ketika Anda memiliki pabrik entitas umum, yang membuat entitas, dan juga bertanggung jawab atas inisialisasi entitas dengan data yang diterima dari DB:
(pseudocode)
sumber
typeof(loggerType)
mengakibatkanloggerType is a variable and used like a type
Itu
Activator.CreateInstance
Metode menciptakan sebuah instance dari tipe tertentu menggunakan konstruktor yang paling cocok dengan parameter yang ditentukan.Misalnya, Anda memiliki nama tipe sebagai string, dan Anda ingin menggunakan string untuk membuat instance dari tipe itu. Anda bisa menggunakan
Activator.CreateInstance
untuk ini:Berikut artikel MSDN yang menjelaskan aplikasinya secara lebih rinci:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
sumber
new Foo()
. Saya pikir OP menginginkan contoh yang lebih realistis.CreateInstance
adalah jika Anda tidak mengetahui jenis objek yang akan Anda buat pada waktu desain. Dalam contoh ini, Anda mengetahui dengan jelas jenisnyaFoo
karena Anda mentransmisikannya sebagai jenisFoo
. Anda tidak akan pernah melakukan ini karena Anda bisa melakukannyaFoo foo = new Foo()
.Membangun dari deepee1 dan ini , berikut ini cara menerima nama kelas dalam string, dan kemudian menggunakannya untuk membaca dan menulis ke database dengan LINQ. Saya menggunakan "dinamis" daripada casting deepee1 karena memungkinkan saya untuk menetapkan properti, yang memungkinkan kita untuk secara dinamis memilih dan beroperasi pada tabel yang kita inginkan.
sumber
Mengapa Anda menggunakannya jika Anda sudah mengetahui kelas tersebut dan akan menayangkannya? Mengapa tidak melakukannya dengan cara lama dan membuat kelas seperti Anda selalu membuatnya? Tidak ada keuntungan untuk ini dibandingkan dengan cara yang biasa dilakukan. Adakah cara untuk mengambil teks dan mengoperasikannya sebagai berikut:
Jika saya sudah tahu ini adalah Pizza, tidak ada keuntungan untuk:
tetapi saya melihat keuntungan besar pada metode Sihir jika itu ada.
sumber
Ditambah dengan refleksi, saya menemukan Activator.CreateInstance sangat membantu dalam memetakan hasil prosedur tersimpan ke kelas khusus seperti yang dijelaskan dalam jawaban berikut .
sumber