Там какой-либо путь состоит в том, чтобы использовать методы C# непосредственно в качестве делегатов?

Это - больше вопроса о синтаксисе 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), хотя, очевидно, который не компилирует.

5
задан guhou 10 July 2010 в 07:41
поделиться

4 ответа

То, что вы ищете, называется 'method groups'. С их помощью вы можете заменить одну строку ламелей, например:

was:

TakeSomeDelegates(x => firstAction(x), (x, y, z) => secondFunc(x, y, z));

after replacing with method groups:

TakeSomeDelegates(firstAction, secondFunc);
4
ответ дан 14 December 2019 в 08:40
поделиться

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

1
ответ дан 14 December 2019 в 08:40
поделиться

Просто пропустите скобки в именах функций.

        TakeSomeDelegates(FirstAction, SecondFunc);

РЕДАКТИРОВАТЬ:

FYI Поскольку скобки в VB необязательны, они должны написать это ...

 TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc)
2
ответ дан 14 December 2019 в 08:40
поделиться

Да, это называется группой методов, и более точный пример этого 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);

Таким образом, вы можете использовать группу методов.

0
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

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