2010-07-10 16 views
5

Jest to raczej pytanie składniowe C# niż rzeczywisty problem, który wymaga rozwiązania. Powiedzmy, że mam metodę, która przyjmuje delegata jako parametr. Powiedzmy, że mam następujące metody zdefiniowane:Czy istnieje sposób użycia metod C# bezpośrednio jako delegatów?

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 */ } 

Teraz jeśli chcę zadzwonić TakeSomeDelegates z FirstAction i SecondFunc jako argumenty, o ile mogę powiedzieć, muszę zrobić coś takiego:

TakeSomeDelegates(x => FirstAction(x), (x,y,z) => SecondFunc(x,y,z)); 

Ale czy istnieje wygodniejszy sposób użycia metody, która pasuje do wymaganego podpisu pełnomocnika bez pisania lambda? Idealnie coś takiego jak TakeSomeDelegates(FirstAction, SecondFunc), chociaż oczywiście to się nie kompiluje.

+1

"Chociaż oczywiście to się nie kompiluje" ... to powinno się skompilować :) – porges

+0

woops, naprawdę nie mam pojęcia, co robiłem źle wcześniej, ale teraz wydaje się działać dobrze teraz. Domyślam się, że jest to dość głupie pytanie: S – guhou

+0

Przepraszamy za zmarnowanie twojego czasu faceci ... Nie jestem również pewien, która odpowiedź należy uznać za poprawną ... czy powinienem po prostu usunąć to pytanie? – guhou

Odpowiedz

4

Co szukasz jest coś, co nazywa 'method groups'. Z nich można zastąpić jeden lamdas linii, takie jak:

było:

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

po wymianie z grupami metoda:

TakeSomeDelegates(firstAction, secondFunc); 
+0

dziękuję za tę odpowiedź! Przyjmę to ze względu na link wyjaśniający, dlaczego to działa :) – guhou

1

Kompilator zaakceptuje nazwy grup metod, w których wymagany jest delegat, o ile potrafi on określić, które przeciążenie wybrać, nie trzeba budować lambda. Jaki jest dokładny komunikat o błędzie kompilatora, który widzisz?

+0

Należy pamiętać, że może on jedynie obliczyć parametry "w", tzn. Nie może rozwiązać typu zwracanego przez metodę: http://stackoverflow.com/questions/3203643/generic-methods-in-net-cannot- have-their-return-types-inferred-why –

+0

Ponieważ nie można przeciążać grup metod na podstawie typu zwracanego, nie stanowi to problemu. (Możesz przeciążyć 'operator implicit' i' operator explicit' na typie zwracanym, ale nie można ich nazwać jako grup metod). –

2

Po prostu pomiń parens na nazwach funkcji.

 TakeSomeDelegates(FirstAction, SecondFunc); 

EDIT:

FYI Ponieważ nawiasy są opcjonalne w VB, muszą napisać to ...

TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc) 
0

Tak nazywa się ją metodą Group, i bardziej precyzyjne przykład z tego ...

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

W ten sposób można użyć metody Grupa.

Powiązane problemy