2010-07-10 11 views
5

Esto es más una pregunta de sintaxis C# en lugar de un problema real que necesita solución. Digamos que tengo un método que toma un delegado como parámetro. Digamos que he los siguientes métodos definidos:¿Hay alguna forma de utilizar los métodos de C# directamente como delegados?

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

Ahora si quiero llamar TakeSomeDelegates con FirstAction y SecondFunc como argumentos, Por lo que yo puedo decir, tengo que hacer algo como esto:

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

¿Pero existe una forma más conveniente de usar un método que se ajuste a la firma de delegado requerida sin escribir una lambda? Idealmente algo como TakeSomeDelegates(FirstAction, SecondFunc), aunque obviamente eso no se compila.

+1

"aunque obviamente eso no compila" ... eso debería compilar :) – porges

+0

woops, realmente no tengo idea de lo que estaba haciendo mal antes, pero parece funcionar bien ahora. Supongo que esta es una pregunta muy tonta: S – guhou

+0

Perdón por perder el tiempo chicos ... Tampoco estoy seguro de qué respuesta marcar como correcta ... ¿Debería simplemente eliminar esta pregunta? – guhou

Respuesta

4

Lo que estamos buscando es algo llamado 'method groups'. Con estos, se puede reemplazar uno lamdas línea, tales como:

fue:

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

después de sustituir con grupos de métodos:

TakeSomeDelegates(firstAction, secondFunc); 
+0

gracias por esta respuesta! Voy a aceptar esto debido al enlace que explica por qué funciona esto :) – guhou

1

El compilador aceptará los nombres de los grupos de métodos donde se necesita un delegado, siempre que pueda determinar qué sobrecarga elegir, no necesita construir una lambda. ¿Cuál es el mensaje de error exacto del compilador que está viendo?

+0

Tenga en cuenta que solo puede determinar los parámetros 'in', es decir, no puede resolver el tipo que devuelve un método: http://stackoverflow.com/questions/3203643/generic-methods-in-net-cannot- have-their-return-types-inferred-why –

+0

Como no se pueden sobrecargar los grupos de métodos según el tipo de devolución, esto no es un problema. (Puede sobrecargar 'operator implicit' y' operator explicit' en el tipo de devolución, pero no pueden nombrarse como grupos de métodos). –

2

Simplemente omita los paréntesis en los nombres de las funciones.

 TakeSomeDelegates(FirstAction, SecondFunc); 

EDIT:

FYI Desde parens son opcionales en VB, tienen que escribir esto ...

TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc) 
0

Sí se llama Grupo Método, y el ejemplo más preciso de eso es ...

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

De esta manera puede usar Method Group.

Cuestiones relacionadas