Есть ли способ использовать методы C # непосредственно в качестве делегатов? - PullRequest
5 голосов
/ 10 июля 2010

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

Ответы [ 4 ]

4 голосов
/ 10 июля 2010

То, что вы ищете, называется " группы методов ". Этим вы можете заменить одну строчку лямда, например:

был:

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

после замены группами методов:

TakeSomeDelegates(firstAction, secondFunc);
2 голосов
/ 10 июля 2010

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

        TakeSomeDelegates(FirstAction, SecondFunc);

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

К вашему сведению Так как в VB символы скобок необязательны, они должны написать это ...

 TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc)
1 голос
/ 10 июля 2010

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

0 голосов
/ 10 июля 2010

Да, это называется Группа методов, и более точным примером этого является ...

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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...