Может ли метод С# вернуть метод?
Может ли метод в С# возвращать метод?
Метод может возвращать lambda expression, но я не знаю, какой тип параметра я могу дать такому методу, потому что метод не 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);
Ответы
Ответ 1
Типы, которые вы ищете, это 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>
Ответ 2
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) {
return x => a * x * x + b * x + c;
}
Возвращаемый тип Func<float, float>
.
Ответ 3
<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
, за исключением того, что его общий.
Ответ 4
Ваши лямбда-выражения возьмут float
как параметр (я полагаю), а затем верну его float
. В .NET мы можем представить это по типу Func<float, float>
.
Как правило, если вы имеете дело с lambdas, которые принимают больше параметров, вы можете использовать Func<Type1, Type2, Type3, ..., ReturnType>
с до восьми параметров.
Ответ 5
Я думаю, вам нужно определение делегата Action <T> . Я надеюсь, что статья Действие <T> Делегат может помочь вам.
Ответ 6
Вы можете использовать ключевое слово dynamic
. См. динамический (ссылка на С#).
Ответ 7
Я думаю, что в вашей ситуации уместен Tuple. Для получения дополнительной информации см. Здесь http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/.