как передать любой метод в качестве параметра для другой функции - PullRequest
1 голос
/ 26 декабря 2011

В классе А у меня есть

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

Теперь мне нужно иметь возможность передать DoOtherThing в AFoo().Мое требование заключается в том, что DoOtherThing может иметь любую подпись с типом возврата, почти всегда void.Примерно так из класса B,

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

void BFoo(//could be anything)
{

}

Я знаю, что могу сделать это с Action или с помощью реализации делегатов (как видно на многих других постах SO), но как этого можно достичь, если подпись функциив классе B неизвестно ??

Ответы [ 3 ]

9 голосов
/ 26 декабря 2011

Вам необходимо передать delegate экземпляр; Action будет работать нормально:

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

Если BFoo не имеет параметров, он будет работать так, как написано в вашем примере:

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

Если для этого нужны параметры, вам нужно указать их:

new ClassA().AFoo("hi", () => BFoo(123, true, "def"));
2 голосов
/ 26 декабря 2011

Используйте Действие или Функ , если вам нужно возвращаемое значение.

Действие: http://msdn.microsoft.com/en-us/library/system.action.aspx

Функция: http://msdn.microsoft.com/en-us/library/bb534960.aspx

0 голосов
/ 14 августа 2014
public static T Runner<T>(Func<T> funcToRun)
{
    //Do stuff before running function as normal
    return funcToRun();
}

Использование:

var ReturnValue = Runner(() => GetUser(99));

Я использую это для обработки ошибок на моем сайте MVC.

...