2010-10-25 6 views
9

के रूप में एक विधि पास करें मैं पैरामीटर के रूप में एक विधि को पारित करने में सक्षम होना चाहता हूँ।एक पैरामीटर

जैसे ..

//really dodgy code 
public void PassMeAMethod(string text, Method method) 
{ 
    DoSomething(text); 
    // call the method 
    //method1(); 
    Foo(); 
} 

public void methodA() 
{ 
    //Do stuff 
} 


public void methodB() 
{ 
    //Do stuff 
} 

public void Test() 
{ 
    PassMeAMethod("calling methodA", methodA) 
    PassMeAMethod("calling methodB", methodB) 
} 

मैं यह कैसे कर सकते हैं?

+0

आपको प्रतिनिधियों के साथ ऐसा करने में सक्षम होना चाहिए। – jimplode

+0

.NET ढांचे का कौन सा संस्करण आप चल रहे हैं? –

+0

3.5, क्या कोई मुझे ऊपर दिए गए उदाहरण का उपयोग करके दिखा सकता है? धन्यवाद – raklos

उत्तर

19

आपको एक प्रतिनिधि का उपयोग करने की आवश्यकता है, जो एक विशेष वर्ग है जो एक विधि का प्रतिनिधित्व करता है। आप या तो अपने स्वयं के प्रतिनिधि को परिभाषित कर सकते हैं या निर्मित में से किसी एक का उपयोग कर सकते हैं, लेकिन प्रतिनिधि के हस्ताक्षर को उस विधि से मेल खाना चाहिए जिसे आप पास करना चाहते हैं।

अपनी खुद की परिभाषा:

public delegate int MyDelegate(Object a); 

यह उदाहरण एक विधि है कि एक पूर्णांक वापस आती है और एक पैरामीटर के रूप एक वस्तु संदर्भ लेता है मेल खाता है।

आपके उदाहरण में, दोनों विधि ए और विधि बी कोई पैरामीटर नहीं लौटाते हैं, इसलिए हम अंतर्निहित एक्शन प्रतिनिधि वर्ग का उपयोग कर सकते हैं।

यहाँ अपने उदाहरण संशोधित किया गया है:

public void PassMeAMethod(string text, Action method) 
{ 
    DoSomething(text); 
    // call the method 
    method();  
} 

public void methodA() 
{ 
//Do stuff 
} 


public void methodB() 
{ 
//Do stuff 
} 

public void Test() 
{ 
//Explicit 
PassMeAMethod("calling methodA", new Action(methodA)); 
//Implicit 
PassMeAMethod("calling methodB", methodB); 

} 

आप देख सकते हैं, तो आप स्पष्ट या परोक्ष प्रतिनिधि प्रकार का उपयोग कर सकते हैं, इनमें से जो भी आप सूट।

7

उपयोग Action<T>

उदाहरण:

public void CallThis(Action x) 
{ 
    x(); 
} 

CallThis(() => { /* code */ }); 
5

या समारोह <>

Func<int, string> func1 = (x) => string.Format("string = {0}", x); 
PassMeAMethod("text", func1); 

public void PassMeAMethod(string text, Func<int, string> func1) 
{ 
    Console.WriteLine(func1.Invoke(5)); 
} 
0

क्या BrunoLM किया पर बिल्डिंग, कि उदाहरण के रूप में संक्षिप्त था।

//really dodgy code 
public void PassMeAMethod(string text, Action method) 
{ 
    DoSomething(text); 
    method(); 
    Foo(); 
} 

// Elsewhere... 

public static void Main(string[] args) 
{ 
    PassMeAMethod("foo",() => 
     { 
      // Method definition here. 
     } 
    ); 

    // Or, if you have an existing method in your class, I believe this will work 
    PassMeAMethod("bar", this.SomeMethodWithNoParams); 
} 
+0

क्या आप एक स्थिर शून्य में 'this' का उपयोग कर सकते हैं? –

2

Delegates भाषा सुविधा है जिसे आप जो करने की कोशिश कर रहे हैं उसे पूरा करने के लिए उपयोग करने की आवश्यकता होगी।

यहाँ एक उदाहरण है ऊपर कोड आप का उपयोग कर (एक शॉर्टकट के रूप Action प्रतिनिधि का उपयोग करते हुए):

//really dodgy code 
public void PassMeAMethod(string text, Action method) 
{ 
    DoSomething(text); 
    method(); // call the method using the delegate 
    Foo(); 
} 

public void methodA() 
{ 
    Console.WriteLine("Hello World!"); 
}  

public void methodB() 
{ 
    Console.WriteLine("42!"); 
} 

public void Test() 
{ 
    PassMeAMethod("calling methodA", methodA) 
    PassMeAMethod("calling methodB", methodB) 
} 
0

C# .net2.0 - मुझे विषय के लिए एक विस्तृत जवाब दिखाने दें (पारित एक विधि के रूप में एक पैरामीटर)। मेरे परिदृश्य में मैं सिस्टम का एक सेट कॉन्फ़िगर कर रहा हूं System.imers.Timer -s, प्रत्येक _Tick विधि के साथ प्रत्येक।

delegate void MyAction(); 

// members 
Timer tmr1, tmr2, tmr3; 
int tmr1_interval = 4.2, 
    tmr2_interval = 3.5; 
    tmr3_interval = 1; 


// ctor 
public MyClass() 
{ 
    .. 
    ConfigTimer(tmr1, tmr1_interval, this.Tmr_Tick); 
    ConfigTimer(tmr2, tmr2_interval, (sndr,ev) => { SecondTimer_Tick(sndr,ev); }); 
    ConfigTimer(tmr3, tmr3_interval, new MyAction((sndr,ev) => { Tmr_Tick((sndr,ev); })); 
    .. 
} 

private void ConfigTimer(Timer _tmr, int _interval, MyAction mymethod) 
{ 
    _tmr = new Timer() { Interval = _interval * 1000 }; 
    // lambda to 'ElapsedEventHandler' Tick 
    _tmr.Elpased += (sndr, ev) => { mymethod(sndr, ev); }; 
    _tmr.Start(); 
} 

private void Tmr_Tick(object sender, ElapsedEventArgs e) 
{ 
    // cast the sender timer 
    ((Timer)sender).Stop(); 
    /* do your stuff here */ 
    ((Timer)sender).Start(); 
} 

// Another tick method 
private void SecondTimer_Tick(object sender, ElapsedEventArgs e) {..} 
संबंधित मुद्दे