У меня есть метод, который принимает делегат 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*/});
Но он показывает синтаксические ошибки. Пожалуйста, дайте мне знать, как использовать общий делегат действий в этом случае?
Вся цель делегата - иметь указатель на метод. Передача ему параметров во время его объявления является бессмысленной. Вместо этого передайте аргументы для вашего делегата в методе, который выполняет делегат, в вашем случае в ExpGenMethod
:
Вы должны сделать это вместо этого:
public void ExpGenMethod(Action<string,int> inputDel)
{
inputDel("Hi", 1);
}
И назовите это так:
ExpGenMethod((x, y) => {/*do something that makes sense*/});
При выполнении этого делегата x
вычисляется значение "Hi"
и y
до 1
.
"Hi", 1
всегда?
(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);
}
"Hi"
и1
не будут слева от=>
.