Передать делегат действия в качестве параметра в C #

2

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

public void ExpMethod(Action inputDel)
{
    inpuDel();
}

Я могу вызвать вышеупомянутый метод следующим образом:

ExpMethod(() => {/*do something that matters*/});

Все работает нормально. Все идет нормально. Теперь я хочу иметь метод, который принимает общий делегат Action в качестве входного параметра - вот так:

public void ExpGenMethod(Action<string,int> inputDel)
{
    // I don't know how to call the supplied delegate as it requires parameters
}

Кроме того, я пытаюсь назвать этот ExpGenMethod следующим образом:

ExpGenMethod(("Hi",1) => {/*do something that makes sense*/});

Но он показывает синтаксические ошибки. Пожалуйста, дайте мне знать, как использовать общий делегат действий в этом случае?

  • 1
    Если вызывающая сторона предоставляет «ввод», ввод должен быть включен в тело лямбды, а не в качестве параметров - так что ваш существующий метод должен все еще работать, и "Hi" и 1 не будут слева от => .
  • 0
    Какую ошибку вы получаете? Пожалуйста, покажите точное сообщение.
Теги:
delegates

2 ответа

6
Лучший ответ

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

Вы должны сделать это вместо этого:

public void ExpGenMethod(Action<string,int> inputDel)
{
    inputDel("Hi", 1);
}

И назовите это так:

ExpGenMethod((x, y) => {/*do something that makes sense*/});

При выполнении этого делегата x вычисляется значение "Hi" и y до 1.

  • 0
    Вы ожидаете, что параметры будут "Hi", 1 всегда?
  • 0
    @VinodSrivastav Конечно нет. Эти значения должны быть вычислены любым кодом - либо внутри этого метода, либо с помощью переданных ему аргументов. Смысл ответа как раз в том, что значения параметров не являются частью делегата. Вместо этого они передаются к нему.
0

(a,b) => {/*do something that matters*/} означает, что a и b являются параметрами, которые будут указаны во время вызова. Здесь вы используете константу, поэтому вы должны сделать что-то вроде () => { use "Hi"; use 1;} () => { use "Hi"; use 1;} и это вернет вас к вашему рабочему примеру.

Если вы хотите передать параметр, вы cna сделаете так:

public void work()
{
    ExpGenMethod((a) => {/*do something that matters*/});
}

public void ExpGenMethod(Action<int> inputDel, int parameterToUse)
{
    inputDel(parameterToUse);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню