Это - больше вопроса о синтаксисе C#, а не фактическая проблема, для которой нужно решение. Скажите, что у меня есть метод, который берет делегата в качестве параметра. Скажем, мне определили следующие методы:
void TakeSomeDelegates(Action<int> action, Func<float, Foo, Bar, string> func)
{
// Do something exciting
}
void FirstAction(int arg) { /* something */ }
string SecondFunc(float one, Foo two, Bar three){ /* etc */ }
Теперь, если я хочу звонить TakeSomeDelegates
с FirstAction
и SecondFunc
как аргументы, Насколько я могу сказать, я должен сделать что-то вроде этого:
TakeSomeDelegates(x => FirstAction(x), (x,y,z) => SecondFunc(x,y,z));
Но есть ли более удобный способ использовать метод, который соответствует необходимой подписи делегата, не пишущий лямбду? Идеально что-то как TakeSomeDelegates(FirstAction, SecondFunc)
, хотя, очевидно, который не компилирует.
То, что вы ищете, называется 'method groups'. С их помощью вы можете заменить одну строку ламелей, например:
was:
TakeSomeDelegates(x => firstAction(x), (x, y, z) => secondFunc(x, y, z));
after replacing with method groups:
TakeSomeDelegates(firstAction, secondFunc);
Компилятор будет принимать имена групп методов, в которых требуется делегат, до тех пор, пока он может определить, какую перегрузку выбрать, вам не нужно создавать лямбда. Какое именно сообщение об ошибке компилятора вы видите?
Просто пропустите скобки в именах функций.
TakeSomeDelegates(FirstAction, SecondFunc);
РЕДАКТИРОВАТЬ:
FYI Поскольку скобки в VB необязательны, они должны написать это ...
TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc)
Да, это называется группой методов, и более точный пример этого is ...
static void FirstAction(int arg) { /* something */ }
static string SecondFunc(float one, Foo two, Bar three) { return ""; }
Action<int> act1 = FirstAction;
Func<float, Foo, Bar, string> act2 = SecondFunc;
TakeSomeDelegates(firstAction, secondFunc);
Таким образом, вы можете использовать группу методов.