2012-04-02 3 views
6

मैं देख रहा हूं कि कैसे ParameterInfo.IsOptional परिभाषित किया गया है (मैं एक आंतरिक आईओसी फ्रेमवर्क में डिफ़ॉल्ट पैरामीटर समर्थन जोड़ रहा हूं), और ऐसा लगता है कि, जब सच है, ParameterInfo.DefaultValue (या वास्तव में ParameterInfo.RawDefaultValue) वास्तव में कोई गारंटी नहीं है लागू होने वाले डिफ़ॉल्ट मान।डिफ़ॉल्ट पैरामीटर और प्रतिबिंब: यदि ParameterInfo.IsOptional तो DefaultValue हमेशा विश्वसनीय है?

आप MSDN example given for IsOptional को देखें, तो यह संभव आईएल में एक पैरामीटर है कि वैकल्पिक है, लेकिन जिसके लिए कोई डिफ़ॉल्ट आपूर्ति की है (यह देखते हुए कि ParameterAttributes.HasDefault स्पष्ट रूप से आपूर्ति होगी) को परिभाषित करने लगता है। अर्थात। संभावित रूप से ऐसी परिस्थिति की ओर अग्रसर होता है कि पैरामीटर प्रकार कहता है, Int32, ParameterInfo.IsOptional सत्य है, लेकिन ParameterInfo.DefaultValue शून्य है।

मेरी भाषा सी # है, इसलिए मैं पर संकलक पर काम कर सकता हूं। के आधार पर इस प्रकार है (parameter यहाँ एक ParameterInfo उदाहरण है, और विधि पैरामीटर के लिए क्रम तर्क के रूप में प्रयोग की जाने वाली एक उदाहरण लौटने का मतलब है) मैं एक साधारण परीक्षण हो सकता है:

if(no_config_value) 
{ 
    if(!parameter.IsOptional) throw new InvalidOperationException(); 
    //it's optional, so read the Default 
    return parameter.DefaultValue; 
} 
else 
    return current_method_for_getting_value(); 

लेकिन मैं मैं सोच रहा हूं कि कुछ भाषाओं (और मैं यह सही आईएल-स्तर पर प्राप्त करना चाहता हूं, सिर्फ एक विशेष कंपाइलर के आधार पर) कॉलर पर ऑनस डालने के लिए डिफ़ॉल्ट मान निर्धारित करने के लिए, यदि ऐसा हो , default(parameter.ParameterType) क्रम में होना आवश्यक है।

इसका कारण यह है DefaultValue जाहिरा तौर पर DBNull.Value (the documentation for RawValue के अनुसार), है अगर कोई डिफ़ॉल्ट है, जहां यह एक छोटे से अधिक दिलचस्प हो जाता है है। पैरामीटर object और IsOptional==true प्रकार का कोई अच्छा नहीं है!

में थोड़ा और अधिक खुदाई किया है, मुझे उम्मीद है विश्वसनीय तरीका यह शारीरिक रूप से ParameterInfo.Attributes सदस्य को पढ़ने के लिए है हल करने के लिए है कि कर रहा हूँ, ParameterAttributes.Default के लिए तो जांच ParameterAttributes.Optional और के लिए जाँच करने के लिए व्यक्तिगत रूप से bitflags पहले पढ़ने। केवल अगर दोनों मौजूद हैं, तो ParameterInfo.DefaultValue पढ़ना सही होगा।

मैं कोडिंग और इसके चारों ओर परीक्षण लिखने जा रहा हूं, लेकिन मैं आशा करता हूं कि अधिक आईएल ज्ञान वाला कोई व्यक्ति है जो मेरे संदेह की पुष्टि कर सकता है और उम्मीद है कि यह किसी भी आईएल- आधारित भाषा (इस प्रकार विभिन्न भाषाओं में पुस्तकालयों के भार को नकल करने की आवश्यकता से बचें!)।

उत्तर

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