System.Type और System.RuntimeType के बीच C # में क्या अंतर है?


89

मैं आज कुछ सम्मेलन परीक्षण करने की कोशिश कर रहा था, और सभी प्रकारों को एक विधानसभा में (कॉल करके Assembly.GetTypes()) प्राप्त कर रहा था, जब मैंने कुछ में ठोकर खाई:

System.RuntimeType:[First.Namespace.FirstClass]

जब भी मैं उस प्रकार की तुलना करने की कोशिश करता हूं typeof(FirstClass), तो वे समान नहीं होते हैं। इसलिए, जब मैं सभी प्रकारों को खोजने की कोशिश करता हूं, जिसमें FirstClassएक सामान्य पैरामीटर होता है, तो मुझे कोई भी नहीं मिल रहा है।

बीच क्या अंतर है System.RuntimeTypeऔर System.Type?

क्या मेरी समस्या को हल करने का कोई तरीका है?


6
क्या आप एक छोटा प्रोग्राम प्रदान कर सकते हैं जो आपके द्वारा अनुभव की जा रही समस्या को प्रदर्शित करता है?
एरिक लिपर्ट

मैं जा रहा था, लेकिन पहले से ही जवाब मिल गया: पी
एडगर गोंजालेज

जवाबों:


108

System.RuntimeTypeएक ठोस वर्ग है जो अमूर्त आधार वर्ग से निकलता है System.Type। चूंकि System.RuntimeTypeसार्वजनिक नहीं है, आप आमतौर पर इसके उदाहरणों का सामना करेंगे System.Type

भ्रम की स्थिति तब पैदा हो सकती है जब आप किसी वस्तु के प्रकार को प्राप्त करने की कोशिश कर रहे हों और गलती GetType()से किसी अन्य वस्तु को पहली वस्तु के प्रकार का प्रतिनिधित्व करने के बजाय सीधे उस वस्तु का उपयोग कर रहे हों। तब Type.ToString()वापस आएगा "System.RuntimeType"जब उस वस्तु को कहा जाता है जो एक प्रकार का प्रतिनिधित्व कर रही है:

string str = string.Empty;
Type strType = str.GetType();
Type strTypeType = strType.GetType();
strType.ToString();     // returns "System.string"
strTypeType.ToString(); // returns "System.RuntimeType"

उदाहरण के लिए, इस ब्लॉग पोस्ट में कोई व्यक्ति किसी डेटाबेस में एक कॉलम का प्रकार प्राप्त करने की कोशिश कर रहा है, कुछ इस तरह से कर रहा है:

object val = reader.GetFieldType(index);
Type runtimeType = val.GetType();
PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");
Type type = (Type)propInfo.GetValue(val, null);

चूंकि वैल पहले से ही एक प्रकार की वस्तु है, इसलिए val.GetType () प्रकार का प्रतिनिधित्व करने वाला एक अन्य प्रकार का ऑब्जेक्ट लौटाएगा System.RuntimeTimeक्योंकि यह मूल प्रकार ऑब्जेक्ट का प्रतिनिधित्व करने के लिए उपयोग किया जाने वाला ठोस प्रकार है। ब्लॉग पोस्ट तब कुछ अनावश्यक प्रतिबिंब चालबाजी दिखाती है, मूल प्रकार के ऑब्जेक्ट को प्राप्त करने के लिए, जब वास्तव में यह आवश्यक था:

Type type = reader.GetFieldType(index) as Type;

इसलिए यदि आपकी Typeवस्तु रिपोर्ट कर रही है कि यह एक का प्रतिनिधित्व करता है System.RuntimeType, तो सुनिश्चित करें कि आपने गलती GetType()से किसी ऐसे प्रकार पर कॉल नहीं किया है जो आपको पहले ही मिल चुका है।


पहला कोड स्निपेट केवल तभी जांचता है कि ऑब्जेक्ट उदाहरण है- Typeयदि आप पास होते हैं तो भी यह वापस आ जाएगा typeof(int)। दूसरा कोड स्निपेट तुलना करने के लिए काम नहीं करता है typeof(string).GetType()और typeof(Type)
मार्क सिडेड

यही वह है जिसकी तलाश में मैं हूं! मुझे थॉमस डेनकेर का पद नहीं मिला, लेकिन डोगल बेल का नहीं
एडगर गोंजालेज

1
@ मर्क सिडेड। अच्छी तरह से देखा, धन्यवाद। अधिक उपयोगी होने के लिए निश्चित उत्तर दिया है, उम्मीद है कि मैंने उस ब्लॉग पोस्ट का हवाला देकर किसी भी भ्रम को दूर किया है।
एर्गवुन

@ एडगर गोंजालेज: मैंने जिस ब्लॉग पोस्ट का संदर्भ दिया था, वह वास्तव में भ्रामक था। कृपया बेहतर जानकारी के लिए मेरा अद्यतन उत्तर देखें।
एर्गवुन

4

System.Type और System.RuntimeType के बीच अलग-अलग के जवाब से थॉमस डेनकर द्वारा :

System.Type एक सार आधार वर्ग है। CLR में आंतरिक प्रकार System.RuntimeType में ठोस कार्यान्वयन है। इस टाइपऑफ़ (स्ट्रिंग) के कारण .GetType () एक RuntimeType देता है लेकिन टाइपऑफ़ (प्रकार) एक सामान्य प्रकार देता है। .Equals मेथड का प्रयोग वास्तव में एक ऑब्जेक्ट करता है। संदर्भ। जो झूठा लौटता है। अपेक्षित परिणाम प्राप्त करने के लिए, आप type.IsInstanceOfType (एलिमेंट) का उपयोग कर सकते हैं। यदि तत्व एक व्युत्पन्न प्रकार का है तो यह भी सही होगा। यदि आप सटीक प्रकार की जांच करना चाहते हैं, तो आपके विधि के गलत होने का रिटर्न-वैल्यू वांछित परिणाम है। RuntimeType की जाँच के लिए आप चेक टाइप (सरणी टाइप, टाइप.गेट टाइप ("System.RuntimeType")) का भी उपयोग कर सकते हैं।


1
"वास्तव में करता है" - क्या हमें व्याकरण सुधार मिल सकता है। यह पूरी चीज की तरह है और इसका कोई मतलब नहीं है।
N73k

2

संक्षेप में...

    "".GetType().ToString()           == "System.String"

    "".GetType().GetType().ToString() == "System.RuntimeType"

जिस तरह से अब मैं इसके बारे में सोचता हूं वह उस System.Typeप्रकार के लिए एक आधार प्रकार है जो रनटाइम के दौरान ऑब्जेक्ट प्रकार अनुरोध परिणामों का प्रतिनिधित्व करता है System.RuntimeType। इसलिए, जब आप किसी वस्तु के प्रकार का अनुरोध करते हैं, तो, जैसा कि लौटाया गया है "".GetType(), उसका उदाहरण System.Typeवंशज है System.RuntimeType। वास्तव में, किसी को यह उम्मीद करनी चाहिए कि यह भी typeof(System.Type).GetType()होना चाहिए System.RuntimeType, लेकिन मुझे लगता है कि फ्रेमवर्क विशेष रूप से इसे रोकता है ... समरूपता।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.