2011-10-19 5 views
9

मेरे पास एक वैकल्पिक पैरामीटर के साथ एक निजी स्थैतिक विधि वाला एक वर्ग है। प्रतिबिंब के माध्यम से मैं इसे किसी अन्य वर्ग से कैसे आमंत्रित करूं? एक समान question है, लेकिन यह स्थिर विधि या वैकल्पिक पैरामीटर को संबोधित नहीं करता है।प्रतिबिंब के माध्यम से वैकल्पिक पैरामीटर के साथ एक निजी स्थैतिक विधि निष्पादित करने के लिए कैसे?

public class Foo { 
    private static void Bar(string key = "") { 
     // do stuff 
    } 
} 

मैं कैसे Foo.Bar("test") और Foo.Bar() (जैसे वैकल्पिक पैरामीटर गुजर बिना) आह्वान करते हैं?

उत्तर

20

सी # में वैकल्पिक पैरामीटर मान को कॉलसाइट पर उन मानों को इंजेक्शन द्वारा संकलित किया जाता है। अर्थात। भले ही अपने कोड

Foo.Bar() 

है संकलक वास्तव में जब विधि आप नियमित रूप से पैरामीटर के रूप में वैकल्पिक पैरामीटर के इलाज के लिए की जरूरत है खोजने

Foo.Bar("") 

जैसा कॉल उत्पन्न करता है।

var method = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic); 

क्या आप जानते हैं कि वास्तव में क्या महत्व देता है आप विधि आप के साथ कर सकते आह्वान करने के लिए करना चाहते हैं:

method.Invoke(obj: null, parameters: new object[] { "Test" }); 

आप केवल कुछ पैरामीटर है और डिफ़ॉल्ट लोगों के मूल्यों का सम्मान करना चाहते हैं आप पैरामीटर वैकल्पिक हैं और वे मान क्या हैं, यह देखने के लिए विधि की ParameterInfo ऑब्जेक्ट्स का निरीक्षण करना होगा। उदाहरण के उन मानकों के मूलभूत मूल्यों प्रिंट करने के लिए आप निम्न कोड इस्तेमाल कर सकते हैं: इस वर्ग का उपयोग करना

foreach (ParameterInfo pi in method.GetParameters()) 
{ 
    if (pi.IsOptional) 
    { 
     Console.WriteLine(pi.Name + ": " + pi.DefaultValue); 
    } 
} 
+0

क्या लागू स्थिर विधि भाग के बारे में इससे पहले कि? – AngryHacker

+0

@AngryHacker 'BindingFlags.Static' का उपयोग करें (अद्यतन उत्तर देखें) – marcind

2

public class Foo 
    { 
    private static void Bar(string key = "undefined key", string value = "undefined value") 
    { 
     Console.WriteLine(string.Format("The key is '{0}'", key)); 
     Console.WriteLine(string.Format("The value is '{0}'", value)); 
    } 
    } 

आप मूलभूत मूल्यों से कॉल करने के लिए निम्न कोड का उपयोग कर सकते

MethodInfo mi = typeof(Foo).GetMethod("Bar", BindingFlags.NonPublic | BindingFlags.Static); 
    ParameterInfo[] pis = mi.GetParameters(); 

    object[] parameters = new object[pis.Length]; 

    for (int i = 0; i < pis.Length; i++) 
    { 
    if (pis[i].IsOptional) 
    { 
     parameters[i] = pis[i].DefaultValue; 
    } 
    } 

    mi.Invoke(null, parameters); 

यदि विधि में कुछ गैर-वैकल्पिक पैरामीटर थे, तो आपको विधि को आमंत्रित करने से पहले उन्हें पैरामीटर सरणी में डालना होगा।

उदा

private static void Bar(int number, string key = "undefined key", string value = "undefined") 

आप

parameters[0] = "23" 

करने के लिए आवश्यक हैं

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

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