Передача функции в качестве параметра

Мне нужен способ определения метода в С# следующим образом:

public String myMethod(Function f1,Function f2)
{
    //code
}

Пусть f1:

public String f1(String s1, String s2)
{
    //code
}

есть ли способ сделать это?

Ответ 1

Конечно, вы можете использовать делегат Func<T1, T2, TResult>:

public String myMethod(
    Func<string, string, string> f1,
    Func<string, string, string> f2)
{
    //code
}

Этот делегат определяет функцию, которая принимает два строковых параметра и возвращает строку. У него есть многочисленные кузены для определения функций, которые принимают различное количество параметров. Чтобы вызвать myMethod другим способом, вы можете просто передать имя метода, например:

public String doSomething(String s1, String s2) { ... }
public String doSomethingElse(String s1, String s2) { ... }

public String myMethod(
    Func<string, string, string> f1,
    Func<string, string, string> f2)
{
    //code
    string result1 = f1("foo", "bar");
    string result2 = f2("bar", "baz");
    //code
}
...

myMethod(doSomething, doSomethingElse);

Конечно, если параметры и возвращаемые типы f2 не совсем одинаковы, вам может потребоваться соответствующим образом настроить подпись метода.