2010-07-10 13 views
5

Questa è più una domanda di sintassi C# piuttosto che un problema reale che deve essere risolto. Supponiamo che abbia un metodo che accetta un delegato come parametro. Diciamo che ho i seguenti metodi definiti:Esiste un modo per utilizzare i metodi C# direttamente come delegati?

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

Ora, se voglio chiamare TakeSomeDelegates con FirstAction e SecondFunc come argomenti, Per quanto posso dire, ho bisogno di fare qualcosa di simile:

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

Ma c'è un modo più conveniente per utilizzare un metodo che si adatti alla firma del delegato richiesta senza scrivere un lambda? Idealmente qualcosa come TakeSomeDelegates(FirstAction, SecondFunc), anche se ovviamente questo non viene compilato.

+1

"anche se ovviamente questo non viene compilato" ... che dovrebbe compilare :) – porges

+0

woops, non ho davvero idea di cosa stavo sbagliando prima, ma sembra funzionare bene ora. Immagino che questa sia una domanda piuttosto stupida: S – guhou

+0

Scusa per aver sprecato il tuo tempo ragazzi ... Sono anche incerto su quale risposta sia corretta ... dovrei semplicemente cancellare questa domanda? – guhou

risposta

4

Cosa stai cercando si chiama qualcosa di 'method groups'. Con questi, è possibile sostituire uno lamdas linea, come ad esempio:

era:

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

dopo la sostituzione con i gruppi di metodo:

TakeSomeDelegates(firstAction, secondFunc); 
+0

grazie per questa risposta! Lo accetterò a causa del link che spiega perché funziona :) – guhou

1

Il compilatore accetterà i nomi dei gruppi di metodi in cui è necessario un delegato, purché sia ​​possibile determinare quale sovraccarico scegliere, non è necessario creare un lambda. Qual è l'esatto messaggio di errore del compilatore che stai vedendo?

+0

Ricorda che può solo capire i parametri 'in', cioè non può risolvere il tipo restituito da un metodo: http://stackoverflow.com/questions/3203643/generic-methods-in-net-cannot- have-their-return-types-inferred-why –

+0

Poiché non è possibile sovraccaricare i gruppi di metodi in base al tipo restituito, questo non è un problema. (È possibile sovraccaricare 'operatore implicito' e' operatore esplicito' sul tipo restituito, ma questi non possono essere nominati come gruppi metodo). –

2

Basta saltare il paren sui nomi delle funzioni.

 TakeSomeDelegates(FirstAction, SecondFunc); 

EDIT:

FYI Da parentesi sono opzionali in VB, devono scrivere questo ...

TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc) 
0

Si è chiamato Metodo Group, e l'esempio più precisa di quello è ...

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

In questo modo è possibile utilizzare Method Group.

Problemi correlati