Может ли метод C # вернуть метод? - PullRequest
31 голосов
/ 03 июля 2011

Может ли метод в C # вернуть метод?

Например, метод может вернуть лямбда-выражение , но я не знаю, какой тип параметра я мог бы дать такому методу, потому что метод не Type. Такой возвращаемый метод может быть назначен какому-либо делегату.

Рассмотрим эту концепцию в качестве примера:

public <unknown type> QuadraticFunctionMaker(float a , float b , float c)
{
    return (x) => { return a * x * x  + b * x + c; };
}

delegate float Function(float x);
Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f);

Ответы [ 7 ]

37 голосов
/ 03 июля 2011

Типы, которые вы ищете: Action<> или Func<>.

Общие параметры обоих типов определяют сигнатуру типа метода. Если ваш метод не имеет возвращаемого значения, используйте Action. Если оно имеет возвращаемое значение, используйте Func, тогда как последний универсальный параметр является типом возвращаемого значения.

Например:

public void DoSomething()                          // Action
public void DoSomething(int number)                // Action<int>
public void DoSomething(int number, string text)   // Action<int,string>

public int DoSomething()                           // Func<int>
public int DoSomething(float number)               // Func<float,int>
public int DoSomething(float number, string text)  // Func<float,string,int>
20 голосов
/ 03 июля 2011
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) {
    return x => a * x * x + b * x + c;
}

Тип возврата Func<float, float>.

3 голосов
/ 03 июля 2011

<unknown type> = Function. То есть

public Function QuadraticFunctionMaker(float a , float b , float c)
{
    return (x) => { return a * x * x  + b * x + c; };
}

Это то, что вы ищете, так как вы уже объявили делегата Function соответствующим. Кроме того, вам вообще не нужно объявлять делегата, и вы можете использовать Func<float, Float>, как это заметили другие. Это в точности эквивалентно. Фактически, Func<T, T> объявляется точно так же, как ваш делегат Function, за исключением того, что оно является общим.

0 голосов
/ 03 июля 2011

Я думаю, кортеж подойдет в вашей ситуации.Для получения дополнительной информации, посмотрите здесь http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/.

0 голосов
/ 03 июля 2011

Я думаю, вам нужно определение делегата Действие . Я надеюсь, что статья Действие Делегат может помочь вам.

0 голосов
/ 03 июля 2011

Вы можете использовать ключевое слово dynamic.См. динамический (C # Reference) .

0 голосов
/ 03 июля 2011

Ваши лямбда-выражения будут принимать float в качестве параметра (я полагаю), а затем возвращать также float .NET мы можем представить это типом Func<float, float>.

Как правило, если вы имеете дело с лямбдами, которые принимают больше параметров, вы можете использовать Func<Type1, Type2, Type3, ..., ReturnType> сдо восьми параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...