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