2015-05-17 6 views
5

मेरे पास यह कोड है जो टेस्ट क्लास से मूल्य प्राप्त करता है और फिर इसे उस प्रकार के रूप में परिवर्तित करता है। यह "Int32" के रूप में सही ढंग से प्रिंट करता है लेकिन जब मैं समान वैल्यू के साथ समान वैल्यू के साथ समानता का परीक्षण करता हूं, तो यह "झूठा" प्रिंट करता है। मुझे संदेह है क्योंकि यह संदर्भ समानता का परीक्षण कर रहा है और 2 चर वास्तव में अभी भी वस्तुएं हैं। क्या उनकी तुलना करने का कोई तरीका है, ध्यान में रखते हुए मुझे रनटाइम तक लौटाए गए मान के प्रकार को नहीं पता होगा (यह एक स्ट्रिंग, फ्लोट, अन्य क्लास इत्यादि हो सकता है)?मैं प्रतिबिंब के "GetValue" से प्राप्त मूल्य-प्रकारों की तुलना कैसे कर सकता हूं?

class Test{public int y;} 

static void Main() 
{ 
    var test1 = new Test{y=1}; 
    var test2 = new Test{y=1}; 
    var fields = test1.GetType().GetFields(); 
    var test1Value = fields[0].GetValue(test1); 
    var test2Value = fields[0].GetValue(test2); 
    var test1Converted = Convert.ChangeType(test1Value, test1Value.GetType()); 
    var test2Converted = Convert.ChangeType(test2Value, test2Value.GetType()); 
    Console.WriteLine(test1Converted); // prints Int32 
    Console.WriteLine(test1Converted == test2Converted); // prints false 
} 

उत्तर

3

Convert पर कॉल अनावश्यक हैं। GetValue द्वारा लौटाए गए मान पहले से ही int एस हैं। बस उन्हें कास्टिंग सही परिणाम देता है।

private class Test 
{ 
    public int y; 
} 

private static void Main() 
{ 
    Test test1 = new Test { y = 1 }; 
    Test test2 = new Test { y = 1 }; 
    FieldInfo[] fields = test1.GetType().GetFields(); 
    int test1Value = (int)fields[0].GetValue(test1); 
    int test2Value = (int)fields[0].GetValue(test2); 
    Console.WriteLine(test1Value); // prints Int32 
    Console.WriteLine(test1Value == test2Value); // prints true 
} 

कारण यह है कि संयुक्त राष्ट्र के casted मूल्यों में विफल रहता है कि Convert.ChangeType अभी भी एक object देता है, जो ints boxes है, तो आप वास्तव में संदर्भ समानता मिलता है है।

Console.WriteLine(test1Converted.Equals(test2Converted)); // prints true 

ध्यान दें कि इस मामले में अभी भी Convert.ChangeType आवश्यक नहीं है:

एक और तरीका है सही मूल्य प्राप्त करने के Equals विधि है, जो सही ढंग से Int32.Equals पर ले जाया जाएगा कहते हैं, और true मुद्रित करने के लिए है।

+1

बराबर संदर्भ के लिए विफल हो जाएगा है प्रकार, यहां यह मान/पूर्णांक प्रकार के लिए सफल है, क्योंकि यह मान तुलना करता है, इसे समान विधि –

+1

@MrinalKamboj के स्पष्ट ओवरराइडिंग की आवश्यकता है क्या आप एक विशिष्ट उदाहरण दे सकते हैं जहां एक संदर्भ प्रकार असफल हो जाएगा? सभी संदर्भ प्रकार * पहले से ही समानता संदर्भ के लिए डिफ़ॉल्ट और 'GetValue' द्वारा बॉक्स नहीं किया जाएगा। –

+0

जैसा कि आपने सुझाव दिया है, संदर्भ बराबर संदर्भ समानता को संदर्भित करता है, डिफ़ॉल्ट बराबर विधि के लिए, इसलिए यह आवश्यक नहीं है कि प्रतिबिंब के माध्यम से दो fetched संदर्भ प्रकार परिवर्तनीय एक ही संदर्भ को इंगित करेंगे, आंतरिक मूल्य की तुलना करने के लिए इसे बराबर विधि के स्पष्ट ओवरराइडिंग की आवश्यकता होगी वर्तमान उत्तर के लिए –

1

कनवर्ट करें। चेंजटाइप() वापसी वस्तु। टिप्पणी के लिए

var test1Converted = (Int32)Convert.ChangeType(test1Value, test1Value.GetType()); 
    var test2Converted = (Int32)Convert.ChangeType(test2Value, test2Value.GetType()); 

संपादित करें:: Int32 को लौट वस्तु कास्ट टेस्ट करता है, तो प्रकार IComparable है, और फिर उस इंटरफ़ेस का उपयोग तुलना करने के लिए: यहाँ से बाहर

if (test1Converted is IComparable && test2Converted is IComparable) 
    { 
     var test1IComparable = (IComparable)test1Converted; 
     var test2IComparable = (IComparable)test2Converted; 

     bool equal = (test1IComparable == test2IComparable); 
    } 
+0

मैं नहीं डाल सकता क्योंकि मुझे नहीं पता ऑब्जेक्ट का प्रकार रनटाइम तक क्या है। यह एक स्ट्रिंग या एक और वर्ग हो सकता है। –

+0

आह, ठीक है, ठीक है तो यह अधिक जटिल हो जाता है :) आप यह देखने के लिए जांच कर सकते हैं कि मान IComparable हैं या नहीं; यदि हां, तो IComparable को कास्ट करें, और उसके बाद। कॉम्पारे (अन्य)। – glenebob

+0

@SupremeGrandRuler: यदि आप '32f' बराबर' 32L' चाहते हैं, तो आपको समस्याएं हैं। अन्यथा, बस 'बराबर() 'पर कॉल करें। – SLaks

-1

मेरी समझ मुख्य अंक में क्या आप रनटाइम तक टेस्ट क्लास फ़ील्ड के प्रकार से अवगत नहीं हैं, और आप पूर्ण टाइपकास्टिंग को एक पूर्णांक प्रकार से बचना चाहते हैं। तो हम दो ऑब्जेक्ट टेस्ट 1 के बीच तुलना कर रहे हैं कन्वर्ट और test2Converted, सरल तरीका ऑब्जेक्ट बेस प्रकार के बराबर विधि को ओवरराइड करेगा, जिसे == तुलना में कॉल किया जाएगा। वर्तमान मामले test1Converted.Equals(test2Converted) में काम करेगा, लेकिन अगर आप संदर्भ प्रकार है, तो आप सही परिणाम के लिए, बराबर विधि ओवरराइड करने के लिए है, के मामले में यह सिर्फ मूल्य प्रकार है, तो कोई मुद्दा

+0

आप ओपी द्वारा पूछे गए एक प्रश्न का उत्तर दे रहे हैं। मूल्य-प्रकार समानता प्राप्त करने के लिए आपको हमेशा गैर-संदर्भ प्रकारों पर 'समानता 'को ओवरराइड करना होगा, लेकिन वास्तव में पूछे गए प्रश्न से इसका कोई लेना-देना नहीं है। –

+0

@ जेसन वाटकिन्स डाउनवोट करने का कोई कारण नहीं है, मेरा जवाब सही कहता है कि बराबर का उपयोग किया जा सकता है और वास्तव में यह कक्षा में संदर्भ प्रकार को भी स्पर्श करता है, उत्तर में समस्या को इंगित करता है, अच्छी बात नहीं एक पिन –

+0

की एक बूंद पर नीचे वोट, दूसरे नीचे मतदाता के लिए, शायद आपको जवाब नहीं समझा है, इसे पढ़ें और गलती को इंगित करें, यह वास्तव में प्रश्न का उत्तर देता है और आगे जाता है –

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

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