Как передать функцию в качестве параметра в C#?

Память кучи похожа на кучу досок. Представьте, что вы учитель. Пока вы преподаете свой класс, доска принадлежит вам, и вы можете делать все, что хотите. Вы можете набросать на него и перезаписать материал по своему усмотрению.

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

55
задан Dan Goldstein 19 December 2008 в 13:06
поделиться

6 ответов

Я думаю, что Вы хотите:

static object InvokeMethod(Delegate method, params object[] args){
    return method.DynamicInvoke(args);
}

static int Add(int a, int b){
    return a + b;
}

static void Test(){
    Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4));
}

Печать "9".

52
ответ дан P Daddy 7 November 2019 в 17:15
поделиться

взгляните на использование делегатов, вот яркий пример

Пример Делегата

, почему Вы используете отражение? когда-либо будет различное количество параметрических усилителей? или Вы знаете, что метод signture останется постоянным (также помнят, что C# поддерживает параметрические усилители [] ключевое слово)

кости params c#

HTH

3
ответ дан dbones 7 November 2019 в 17:15
поделиться

Взгляд Серия Функционального программирования Justin Etheredge. Необходимо найти решение проблемы там.

3
ответ дан Sampson 7 November 2019 в 17:15
поделиться

Преобразование группы метода, анонимного метода или лямбда-выражения делегату требует, чтобы компилятор знал точный тип делегата. Однако Вы могли потенциально использовать лямбда-выражения и получили переменные для создания этого более простым:

public void InvokeMethod(Action action)
{
    action();
}

public int Add(int a, int b)
{
    return a + b;
}

public void Test()
{    
    InvokeMethod(() => Add(2, 3));
}

, Который в основном задерживает вызов нормальным способом, но путем обертывания фактического вызова к Add в плоскости Action делегат.

, Если это не выполняет Ваши требования, возможно, можно сказать нам немного больше о том, чего Вы действительно пытаетесь достигнуть.

РЕДАКТИРОВАНИЕ: Если это сгенерировано код, можно бросить к Func<...> с правильными аргументами типа - предполагающий, что нет слишком многих. Кроме этого, нет никакого реального способа просто передачи в группе метода. Были случайные призывы "infoof (...)" оператор (как typeof, но для участников), который дал бы Вам MemberInfo, но это на самом деле не существует.

46
ответ дан Jon Skeet 7 November 2019 в 17:15
поделиться

У Вас должен быть делегат сначала

delegate int Operation(int a, int b)

тогда, это становится:

public void InvokeMethod(Operation method, object target, object param)
{
    method((int) target, (int) param);
}

Никакая потребность в любом вызове для Вызова.

Как с dbone я не уверен, почему Вам были бы нужны параметрические усилители [] массив. Вы разъяснили бы расширенное использование для параметрических усилителей?

кроме того, я должен буду исправить что-то в Вашем вопросе, хотя, потому что он вызовет ошибку компиляции: p

4
ответ дан Jon Limjap 7 November 2019 в 17:15
поделиться

Что-то вроде этого должно работать на Вас:

delegate int MyDelegate(int a, int b);
public int Add(int a, int b) {
    return a + b;
}
public void InvokeMethod(Delegate method, object[] param) {
    Console.WriteLine(method.DynamicInvoke(param));
}
public Form1() {       
    InitializeComponent();
    InvokeMethod(new MyDelegate(Add), new object[] { 1, 2 });
}

Удачи!

1
ответ дан Mark Carpenter 7 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: