2010-04-28 5 views
9

मैं वर्तमान में अपने स्वयं के मनोरंजन के लिए लिंककैड समकक्ष आईएन सी # से डंप() विधि लिखने की कोशिश कर रहा हूं। मैं जावा से सी # में जा रहा हूं और यह व्यवसाय की आवश्यकता के बजाय एक अभ्यास है। मुझे डिक्शनिंग डिक्शनरी को छोड़कर लगभग सबकुछ काम कर रहा है।सी # प्रतिबिंब - मैं कैसे बता सकता हूं कि ऑब्जेक्ट ओ कुंजीवैल्यूयर प्रकार है और फिर इसे कास्ट करें?

समस्या यह है कि KeyValuePair एक मान प्रकार है। अधिकांश अन्य मूल्य प्रकारों के लिए मैं बस ToString विधि को कॉल करता हूं लेकिन यह अपर्याप्त है क्योंकि KeyValuePair में अनावश्यक ToString विधियों के साथ अंक और अन्य ऑब्जेक्ट्स हो सकते हैं। तो मुझे यह काम करने की ज़रूरत है कि यह एक KeyValuePair है और फिर इसे कास्ट करें। जावा में मैं इसके लिए वाइल्डकार्ड जेनरिक का उपयोग कर सकता हूं लेकिन मुझे सी # के बराबर नहीं पता है।

आपकी खोज, ऑब्जेक्ट ओ दिया गया है, यह निर्धारित करें कि यह एक KeyValuePair है और इसकी कुंजी और मूल्य पर प्रिंट करें।

Print(object o) { 
    ... 
} 

धन्यवाद! आप KeyValuePair आप प्रतिबिंब कोड का एक सा व्यायाम करने के लिए की जरूरत में संग्रहीत प्रकार पता नहीं है

उत्तर

31

है। तब

if (value != null) 
{ 

, चलो सुनिश्चित मूल्य सामान्य है चलो:

की क्या जरूरत है पर नजर डालते हैं:

सबसे पहले, के मूल्य सुनिश्चित करते है नहीं null

Type valueType = value.GetType(); 
    if (valueType.IsGenericType) 
    { 

फिर , सामान्य प्रकार की परिभाषा निकालें, जो KeyValuePair<,> है:

 Type baseType = valueType.GetGenericTypeDefinition(); 
     if (baseType == typeof(KeyValuePair<,>)) 
     { 

तो मूल्यों के प्रकार को निकालने के उस में:

  Type[] argTypes = baseType.GetGenericArguments(); 

अंतिम कोड:

if (value != null) 
{ 
    Type valueType = value.GetType(); 
    if (valueType.IsGenericType) 
    { 
     Type baseType = valueType.GetGenericTypeDefinition(); 
     if (baseType == typeof(KeyValuePair<,>)) 
     { 
      Type[] argTypes = baseType.GetGenericArguments(); 
      // now process the values 
     } 
    } 
} 

आप की खोज की है, तो उस वस्तु वास्तव में एक KeyValuePair<TKey,TValue> में क्या है आप वास्तविक कुंजी निकाल सकते हैं और इस तरह का मान:

object kvpKey = valueType.GetProperty("Key").GetValue(value, null); 
object kvpValue = valueType.GetProperty("Value").GetValue(value, null); 
+0

मैं बस सुझाव देने वाला था बिल्कुल यही .. :) अच्छा जवाब – Tigraine

+0

कमाल का जवाब, बहुत बहुत धन्यवाद – Logan

+2

यहां प्रतिबिंब का उपयोग प्रदर्शन को अधिक प्रभावित करेगा? – JDandChips

0
+0

अंग्रेजी भाषा लिंक http://msdn.microsoft.com/library/scekt9xw(VS.80).aspx –

+1

मुझे लगता है कि यह जेनेरिक के साथ समस्याग्रस्त हो जाता है। चूंकि KeyValuePair KeyValuePair जैसा नहीं है .. और वास्तव में यह परवाह नहीं करता कि यह किस प्रकार का है, जब तक इसमें कोई .ToString() है .. (टी: कक्षा) – Tigraine

1

मान लें कि आप जेनेरिक KeyValuePair का उपयोग कर रहे हैं आप शायद जरूरत है इस तरह के दोनों कुंजी और मान के लिए एक स्ट्रिंग का उपयोग कर बनाया एक के रूप में, एक विशेष इन्स्टेन्शियशन के लिए परीक्षण करना चाहते हैं:

public void Print(object o) 
{ 
    if (o == null) 
     return; 

    if (o is KeyValuePair<string, string>) 
    { 
     KeyValuePair<string, string> pair = (KeyValuePair<string, string>)o; 
     Console.WriteLine("{0} = {1}", pair.Key, pair.Value); 
    } 
} 

आप KeyValuePair के किसी भी प्रकार के लिए परीक्षण करना चाहते हैं तो आप प्रतिबिंब का उपयोग करना होगा। क्या आप?

संबंधित मुद्दे

 संबंधित मुद्दे