अस्पष्ट मैच अपवाद से बचना


115

मैं एक स्थिर विधि Parse को प्रतिबिंब के माध्यम से एक प्रकार पर लागू कर रहा हूं क्योंकि मुझे संकलन-समय पर ऑब्जेक्ट का प्रकार पता नहीं है (मुझे पता है, हालांकि, इसमें एक Parse विधि है, एक स्ट्रिंग ले रही है)।

हालाँकि, मुझे एक अस्पष्ट मैच अपवाद मिल रहा है, संभवत: क्योंकि एक ही वस्तु (स्ट्रिंग, इंट, डबल आदि) को लेने के लिए बहुत सारे अतिभारित पार्स तरीके हैं।

मैं सही विधि ( पार्स (स्ट्रिंग एस) ) तक पहुंचने के लिए अपनी पद्धति के आह्वान में अधिक विशिष्ट कैसे हो सकता हूं और अपवाद नहीं फेंका गया है।

मेरा कोड इस तरह दिखता है:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

जवाबों:


193

इस अधिभार का उपयोग करें और उपयोग करें

returnType.GetMethod("Parse", new [] {typeof(string)})

9
@Bitterblue मैं उलझन में हूं कि आप वह टिप्पणी क्यों लिखेंगे - और आप शैली के मामलों पर चर्चा करने लायक क्यों हैं?
बेंजामिन पॉडज़ुन

9
प्रस्तुति ठीक है, यह सिर्फ एक अलग शैली का पालन करने के लिए होता है, जिसे आप पसंद करते हैं। आपने "मैं इस बाइक शेड का उपयोग करूंगा, अगर यह थोड़ा अधिक नीला होता" की तर्ज पर टिप्पणी की। जो मुझे भ्रमित करता है। टिप्पणी का संपादन: जब तक आप इस बात से अनजान न हों कि नया [] {} वास्तव में इस मामले में Array और IS के प्रकार को नए प्रकार [] के बराबर बनाता है ? उस स्थिति में मुझे खेद है - मैंने मान लिया कि आप शैली पर टिप्पणी करते हैं (दोनों काम करते हैं) जबकि संभवतः यह सोचते हुए कि स्निपेट गलत है (यह नहीं है)।
बेंजामिन पॉडज़ुन

1
उत्तर के लिए धन्यवाद दोस्तों। अगले आदमी को कुछ परेशानियों से बचाने के लिए, संदर्भ प्रकारों के लिए, कुछ इस तरह का उपयोग करें: टाइपोफ़ (स्ट्रिंग) ।MakeByRefType ();
BRebey

5
@Bitterblue मैं 'यंग' नहीं हूं और यकीन है कि कृपालु लगता है। एक प्रोग्रामर जो new [] { typeof(string) }कोड को बनाए रखने के अलावा अन्य मुद्दों को नहीं पढ़ सकता है । प्रकार वस्तुतः वहीं है। प्लस 'क्रेजी वन-लाइनर्स' प्रासंगिक नहीं हैं, आपकी पसंदीदा शैली बस इस बहुत ही अनावश्यक अक्षरों को जोड़ देती है। मेरा तर्क है कि new Type[] {...}कम पठनीय है, क्योंकि लाइन लंबी है और यह अप्रासंगिक जानकारी / बॉयलरप्लेट / शोर है। इसलिए: यह शैली की बात है और आपने एक निष्क्रिय आक्रामक के साथ चर्चा शुरू की है 'अगर यह मेरे स्वाद को पूरा करता, तो यह होता।'
बेंजामिन पॉडज़ुन

2
सावधान रहें, यह काम नहीं करेगा यदि 2 विधियों में समान नाम, समान संख्या में पैरामीटर और समान प्रकार के पैरामीटर हैं। मैं यहाँ स्पष्ट कलाकारों के अधिभार के बारे में सोच रहा हूँ। उदाहरण के लिए public static explicit double(MyType obj)और public static explicit float(MyType obj)। आप अभी भी एक होगा AmbiguousMatchException। इस मामले में, आप returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))उदाहरण के लिए उपयोग कर सकते हैं ।
गिलाउम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.