Saya mencoba melakukan beberapa tes konvensi hari ini, dan mendapatkan semua tipe dalam sebuah majelis (dengan menelepon Assembly.GetTypes()
), ketika saya menemukan sesuatu:
System.RuntimeType:[First.Namespace.FirstClass]
Setiap kali saya mencoba membandingkan tipe itu dengan typeof(FirstClass)
, mereka tidak sama. Jadi, ketika saya mencoba menemukan semua tipe yang mengandung FirstClass
sebagai parameter umum, saya tidak menemukan satupun.
Apa perbedaan antara System.RuntimeType
dan System.Type
?
Apakah ada cara untuk menyelesaikan masalah saya?
c#
reflection
Edgar Gonzalez
sumber
sumber
Jawaban:
System.RuntimeType
adalah kelas beton yang diturunkan dari kelas dasar abstrakSystem.Type
. KarenaSystem.RuntimeType
tidak bersifat publik, Anda biasanya akan menemukan contohnya sebagaiSystem.Type
.Kebingungan bisa muncul ketika Anda mencoba untuk mendapatkan tipe sebuah objek dan secara keliru memanggil
GetType()
objek lain yang mewakili tipe objek pertama, daripada hanya menggunakan objek itu secara langsung. KemudianType.ToString()
akan kembali"System.RuntimeType"
ketika objek yang dipanggil mewakili Tipe:string str = string.Empty; Type strType = str.GetType(); Type strTypeType = strType.GetType(); strType.ToString(); // returns "System.string" strTypeType.ToString(); // returns "System.RuntimeType"
Misalnya, dalam posting blog ini seseorang mencoba mendapatkan jenis kolom dalam database, melakukan sesuatu seperti ini:
object val = reader.GetFieldType(index); Type runtimeType = val.GetType(); PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); Type type = (Type)propInfo.GetValue(val, null);
Karena val sudah menjadi objek Tipe, val.GetType () akan mengembalikan objek Tipe lain yang mewakili tipe
System.RuntimeTime
karena ini adalah tipe konkret yang digunakan untuk merepresentasikan objek tipe asli. Posting blog kemudian menunjukkan beberapa tipu daya refleksi yang tidak perlu, untuk mendapatkan jenis objek tipe asli, padahal yang dibutuhkan hanyalah:Type type = reader.GetFieldType(index) as Type;
Jadi jika
Type
objek Anda melaporkan bahwa itu mewakili aSystem.RuntimeType
, pastikan Anda tidak secara tidak sengaja memanggilGetType()
tipe yang sudah Anda dapatkan.sumber
Type
mengembalikan nilai true meskipun Anda lulustypeof(int)
. Potongan kode kedua tidak berfungsi untuk membandingkantypeof(string).GetType()
dantypeof(Type)
.Dari jawaban untuk Perbedaan antara System.Type dan System.RuntimeType oleh Thomas Danecker :
sumber
Secara singkat...
"".GetType().ToString() == "System.String" "".GetType().GetType().ToString() == "System.RuntimeType"
Cara saya sekarang memikirkannya adalah bahwa
System.Type
tipe dasar untuk tipe yang mewakili hasil permintaan tipe objek saat runtime, yaituSystem.RuntimeType
. Jadi, ketika Anda meminta tipe objek, seperti"".GetType()
,, instance yangSystem.Type
dikembalikan adalah turunannyaSystem.RuntimeType
,. Sebenarnya, orang harus berharap bahwatypeof(System.Type).GetType()
seharusnyaSystem.RuntimeType
juga, tetapi saya pikir kerangka kerjanya secara khusus mencegah ... simetri ini.sumber
Lihatlah blog ini, pria itu berbicara tentang perbedaannya. Menurut saya, kelas-kelas ini adalah hasil dari pengoptimalan .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
sumber