एक बुनियादी कार्यक्रम लेते हैं।
फू के लिए:
.method public hidebysig static void Foo([opt] int32 i) cil managed
{
.param [1] = int32(0x00000005)
// Code size 24 (0x18)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "hi"
IL_0006: ldarg.0
IL_0007: box [mscorlib]System.Int32
IL_000c: call string [mscorlib]System.String::Concat(object,
object)
IL_0011: call void [mscorlib]System.Console::WriteLine(string)
IL_0016: nop
IL_0017: ret
} // end of method Program::Foo
मुख्य लिए:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: call void ConsoleApplication3.Program::Foo(int32)
IL_0007: nop
IL_0008: ret
} // end of method Program::Main
सूचना है कि मुख्य 5 कॉल के हिस्से के रूप hardcoded गया है, और फू में। कॉलिंग विधि वास्तव में उस मान को हार्डकोड कर रही है जो वैकल्पिक है! मूल्य कॉल-साइट और कैली साइट दोनों पर है।
आप फ़ॉर्म का उपयोग करके वैकल्पिक मूल्य पर प्राप्त करने में सक्षम हो जाएगा:
typeof(SomeClass).GetConstructor(new []{typeof(string),typeof(int),typeof(int)}) .GetParameters()[1].RawDefaultValue
DefaultValue के लिए MSDN (अन्य जवाब में बताया गया) पर:
यह गुण है केवल निष्पादन संदर्भ में प्रयोग किया जाता है। प्रतिबिंब-केवल संदर्भ में, इसके बजाय RawDefaultValue प्रॉपर्टी का उपयोग करें। MSDN
और अंत में एक POC:
static void Main(string[] args)
{
var optionalParameterInformation = typeof(SomeClass).GetConstructor(new[] { typeof(string), typeof(int), typeof(int) })
.GetParameters().Select(p => new {p.Name, OptionalValue = p.RawDefaultValue});
foreach (var p in optionalParameterInformation)
Console.WriteLine(p.Name+":"+p.OptionalValue);
Console.ReadKey();
}
http://bartdesmet.net/blogs/bart/archive/2008/10/31/c-4-0-feature-focus-part-1-optional-parameters.aspx
स्रोत
2012-12-23 07:37:57
लॉल से ऊपर संपादित करें देखें - कन्स्ट्रक्टर में टाइपो को ठीक किया गया है ... मैं एक और उदाहरण से कॉपी कर रहा था। डी एसओ पर प्रयोग किया जाता है; ओ – BlueChippy
इससे कोई फर्क पड़ता है। उस स्थिति में आप GetMethod() के बजाय [type] .GetConstructor() का उपयोग करना चाहेंगे। –
उत्तर के लिए खाते में अपडेट किया गया उत्तर। तीसरा वैकल्पिक मान प्राप्त करने के लिए आप 1 से 2 बदल सकते हैं। मैंने इसका परीक्षण किया और यह मेरी मशीन पर काम करता है, और DefaultValue [RawDefaultValue के बजाय] प्रतिबिंब के संदर्भ के आधार पर भी काम करना चाहिए। –