2012-07-12 19 views
21

मैं अपनी संपत्ति कैसे प्राप्त कर सकता हूं? वर्तमान में Ambiguous match found की एक त्रुटि हो रही है, कोड में टिप्पणी पंक्ति देखें।नई संपत्ति पर "अस्पष्ट मिलान मिला" में GetProperty प्रतिबिंब परिणाम

public class MyBaseEntity 
{ 
    public MyBaseEntity MyEntity { get; set; } 
} 

public class MyDerivedEntity : MyBaseEntity 
{ 
    public new MyDerivedEntity MyEntity { get; set; } 
} 

private static void Main(string[] args) 
{ 
    MyDerivedEntity myDE = new MyDerivedEntity(); 

    PropertyInfo propInfoSrcObj = myDE.GetType().GetProperty("MyEntity"); 
    //-- ERROR: Ambiguous match found 
} 
+1

रनटाइम त्रुटि या संकलन समय त्रुटि? –

+1

@Valamas कृपया चयनित उत्तर पर पुनर्विचार करें। कई लोग सशर्त संरचनाओं जैसे 'if (winform.GetType()। GetProperty ("आइटम")! = Null) {..}' में इस मामले में केवल एक लिंकक का उपयोग कर अपवादों को स्विच करता है ... –

उत्तर

24

Type.GetProperty

स्थितियों में AmbiguousMatchException होता है ...

... व्युत्पन्न प्रकार एक संपत्ति है कि एक ही नाम के साथ एक विरासत संपत्ति छुपाता वाणी, नए संशोधक

का उपयोग करके

यदि आप निम्नलिखित

चलाते हैं
var properties = myDE.GetType().GetProperties().Where(p => p.Name == "MyEntity"); 

आप देखेंगे कि दो PropertyInfo ऑब्जेक्ट्स लौटा दिए गए हैं। MyBaseEntity और MyDerivedEntity के लिए एक। यही कारण है कि आप प्राप्त कर रहे हैं संदिग्ध मैच त्रुटि मिली।

आप MyDerivedEntity इस तरह के लिए PropertyInfo प्राप्त कर सकते हैं:

PropertyInfo propInfoSrcObj = myDE.GetType().GetProperties().Single(p => 
    p.Name == "MyEntity" && p.PropertyType == typeof(MyDerivedEntity)); 
+2

+1। स्पष्टीकरण पर अच्छे हाथ। मैंने बस मामले में आरटीएफएम लिंक जोड़ा है। –

+0

शानदार सामान! मैंने इसे टाइप किया। टाइप करें। गेटप्रॉपर्टीज()। पहला (पी => पी। नाम == "मायइन्टिटी") 'सभी परीक्षण हरे हैं! –

+1

'पहले' या 'एकल' के बावजूद, दोनों ** एक अपवाद फेंक देंगे जब कोई तत्व मौजूद नहीं है ** शुरू करने के लिए! –

5

केविन पहले से ही इस मुद्दे को कहा, लेकिन आप जटिल बयान की जरूरत नहीं है, या LINQ कि के लिए:

PropertyInfo propInfoSrcObj = myDE.GetType(). 
    GetProperty("MyEntity", typeof(MyDerivedEntity)); 
16

के लिए संपत्ति:

MemberInfo property = myDE.GetProperty(
    "MyEntity", 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); 

विधि के लिए:

MemberInfo method = typeof(String).GetMethod(
    "ToString", 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, 
    null, 
    new Type[] { },// Method ToString() without parameters 
    null); 

BindingFlags .DeclaredOnly - निर्दिष्ट करता है कि केवल सदस्यों की घोषणा में आपूर्ति प्रकार के पदानुक्रम के स्तर माना जाना चाहिए। विरासत वाले सदस्यों पर विचार नहीं किया जाता है।

0

मुझे यह समस्या मेरे स्थान के ऑब्जेक्ट के MsgPack क्रमबद्धरण के साथ हो रही थी। मेरे स्थानकी कक्षा में परिभाषित ऑपरेटरों के रूप में समाप्त हुआ। इन दोनों ऑपरेटरों को परिभाषित करने के बाद DefaultContext.GetSerializer(obj.GetType()); को संक्रमित करने की कोशिश करते समय अस्पष्ट मैच मिला। ऑपरेटरों के एक सेट को हटाने से समस्या दूर हो गई।

public static bool operator ==(int key1, LocationKey key2) 
{ 
    return key1 == key2.Value; 
} 

public static bool operator !=(int key1, LocationKey key2) 
{ 
    return key1 != key2.Value; 
} 

public static bool operator ==(LocationKey key1, int key2) 
{ 
    return key1.Value == key2; 
} 

public static bool operator !=(LocationKey key1, int key2) 
{ 
    return key1.Value != key2; 
} 
9

अस्पष्टता MyDerivedEntity में new घोषणा के कारण होती है। इस पर काबू पाने के लिए आप LINQ का उपयोग कर सकते हैं:

var type = myObject.GetType(); 
var colName = "MyEntity"; 
var all = type.GetProperties().Where(x => x.Name == colName); 
var info = all.FirstOrDefault(x => x.DeclaringType == type) ?? all.First(); 

यह व्युत्पन्न प्रकार से बाहर संपत्ति अन्यथा आधार हड़पने अगर यह मौजूद है। यदि आवश्यक हो तो यह आसानी से फ्लिप-फ्लॉप किया जा सकता है।

+1

यह वास्तव में अधिक सार्वभौमिक और एक्स्टेंसिबल समाधान है। – it3xl

+1

बहुत कुशल समाधान! लेकिन मुझे डर है कि गुणों के आदेश की गारंटी नहीं है: _ 'एम: सिस्टम। टाइप.गेटप्रॉपर्टीज' विधि किसी विशेष क्रम में गुणों को वापस नहीं करती है, जैसे वर्णमाला या घोषणा आदेश। आपका कोड उस क्रम पर निर्भर नहीं होना चाहिए जिसमें गुण लौटाए जाते हैं, क्योंकि वह आदेश भिन्न होता है ._ ([एमएसडीएन दस्तावेज़ीकरण] से लिया गया है (https://msdn.microsoft.com/en-us/library/aky14axb.aspx#Anchor_1)) – KnorxThieus

+0

शीर्ष पर व्यापक रूप से स्वीकृत उत्तर की तुलना में एक बेहतर और अधिक सार्वभौमिक समाधान –

1

मुझे लगता है मैं इसके लिए खोज ब्राउज़र कंसोल में यह त्रुटि आई और मैंने पाया इस अपवाद सी # और जवाब के लिए है सी # के लिए भी है तो मैं अपने कोड को देखने के लिए कोशिश करते हैं और जहां समस्या होती है मैंने पाया:

मेरे पास AJAX पोस्ट विधि है और जब मैं डेटा पोस्ट करता हूं तो यह त्रुटि मिलती है, इसलिए मैंने जो डेटा पारित किया है उसे सी # वेब विधि द्वारा एकत्र किया जाएगा, इसलिए जब मैं उस मॉडल को देखता हूं तो मेरे पास एक ही नाम के साथ 2 गुण होते हैं, इसलिए मैं एक और समस्या और अपवाद को हटा देता हूं हल हो गया