2010-07-10 2 views
5

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

+1

«хотя, очевидно, это не скомпилировать» ... что должно компилироваться :) – porges

+0

woops, я действительно не знаю, что я делал неправильно раньше, но, похоже, сейчас все работает нормально. Я думаю, это довольно глупый вопрос: S – guhou

+0

Извините за то, что тратил время на ребята ... Я также не уверен, какой ответ отметить как правильный ... Должен ли я просто удалить этот вопрос? – guhou

ответ

4

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

был:

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

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

TakeSomeDelegates(firstAction, secondFunc); 
+0

спасибо за этот ответ! Я собираюсь принять это из-за ссылки, объясняющей, почему это работает :) – guhou

1

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

+0

Имейте в виду, что он может вычислять только параметры «in», то есть не может разрешить тип возвращаемого метода: http://stackoverflow.com/questions/3203643/generic-methods-in-net-cannot- have-their-return-types-inferred-why –

+0

Поскольку вы не можете перегружать группы методов на основе типа возврата, это не проблема. (Вы можете перегружать 'operator implicit' и' operator explicit' на тип возвращаемого значения, но их нельзя назвать группами методов). –

2

Просто пропустите парады над именами функций.

 TakeSomeDelegates(FirstAction, SecondFunc); 

EDIT:

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

TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc) 
0

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

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

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

Смежные вопросы