Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to pass any method as a parameter for another function

In class A, I have

internal void AFoo(string s, Method DoOtherThing)
{
    if (something)
    {
        //do something
    }
    else
        DoOtherThing();
}

Now I need to be able to pass DoOtherThing to AFoo(). My requirement is that DoOtherThing can have any signature with return type almost always void. Something like this from Class B,

void Foo()
{
    new ClassA().AFoo("hi", BFoo);
}

void BFoo(//could be anything)
{

}

I know I can do this with Action or by implementing delegates (as seen in many other SO posts) but how could this be achieved if signature of the function in Class B is unknown??

like image 321
nawfal Avatar asked Aug 09 '26 10:08

nawfal


2 Answers

You need to pass a delegate instance; Action would work fine:

internal void AFoo(string s, Action doOtherThing)
{
    if (something)
    {
        //do something
    }
    else
        doOtherThing();
}

If BFoo is parameterless it will work as written in your example:

new ClassA().AFoo("hi", BFoo);

If it needs parameters, you'll need to supply them:

new ClassA().AFoo("hi", () => BFoo(123, true, "def"));
like image 190
Marc Gravell Avatar answered Aug 10 '26 23:08

Marc Gravell


Use an Action or Func if you need a return value.

Action: http://msdn.microsoft.com/en-us/library/system.action.aspx

Func: http://msdn.microsoft.com/en-us/library/bb534960.aspx

like image 24
Xcalibur37 Avatar answered Aug 11 '26 01:08

Xcalibur37