2012-07-31 17 views
6

Hola, estoy tratando de lograr algo como esto;Expresión Lambda que devuelve un delegado

Method<TObjectType>(m=>m.GetData); //m is the instance of TObjectType 

si puedo tener éxito en eso, entonces puedo visitar esta expresión y obtener el método GetData y utilizarla para crear una consulta SQL dinámico. Podría hacer esto dando el nombre del método como una cadena, sin embargo, no quiero romper el fuerte mundo de mis amigos desarrolladores.

Sé que tengo que dar la definición exacta del delegado, pero esto todavía no me ayudó;

void Method<TObjectType>(Expression<Func<TObjectType, Delegate>> ex){/**/} 

¿Tiene una idea?

+0

¿Sabe usted algo acerca de 'GetData()'? ¿Sabes que siempre tendrá cero parámetros, o algo así? – svick

+0

Si no conoce la firma del método GetData, abandonará el mundo fuertemente tipado. –

+0

Esto podría ayudarlo también http://stackoverflow.com/questions/2840438/lambda-returning-another-lambda – Vinoth

Respuesta

6

Desafortunadamente, apenas existe algo así como "un delegado". Para la mayoría de los propósitos (y especialmente: para resolver un MethodInfo), debe ser un delegado fuertemente tipado. Esto es porque GetData no es un método, es un grupo de métodos. Realmente necesita especificar el método con precisión, o tener un tipo de delegado conocido (que en última instancia hace lo mismo).

Tiene dos opciones prácticas; trabaje a object, o agregue un genérico. Por ejemplo:

void Method<TObjectType>(Expression<Func<TObjectType,object>> ex) {...} 

quiere trabajar, como lo haría:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,TValue>> ex) {...} 

El llamador debería usar:

Method<Foo>(x => x.GetData()); 

Si realmente desea utilizar un delegado, el tipo debe ser predecible, por ejemplo:

void Method<TObjectType>(Expression<Func<TObjectType,Func<int>>> ex) 

permitiendo:

Method<Foo>(x => x.GetData); 

Alternativamente, si se sabe (por ejemplo) que el método es siempre sin parámetros, pero no sabe el tipo de retorno; tal vez algo como:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,Func<TValue>>> ex) 

que permite:

Method<Foo, int>(x => x.GetData); 
+0

En este escenario, supongo que estás asumiendo que el método GetData no tiene parámetros. para que pueda definirlo con el Func . Lo que significa que tengo que hacer muchas sustituciones de métodos, ¿estoy en lo correcto? –

+0

@lazycoder Aconsejaría que no lo haga, porque terminará haciendo un método con una cantidad insana de argumentos de tipo genérico, que es bastante inconveniente para llamar. De hecho, aconsejaría el enfoque más simple de 'objeto' /' TValue', con la persona que llama especifica 'x.GetData()'. Para sobrecargas más complejas, siempre pueden especificar 'x.GetData (123," abc ", DateTime.Now)' - el árbol de expresiones le dirá qué sobrecarga usaron y (si lo desea) los valores del parámetro. –

+0

@lazycode Peor caso, necesita dos sobrecargas; un 'Func ', one 'Action ' (para los métodos 'void') –

0

¿Estás buscando algo como esto?

object InvokeMethod(Delegate method, params object[] args){ 
    return method.DynamicInvoke(args); 
} 

int Add(int a, int b){ 
    return a + b; 
} 

void Test(){ 
    Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4)); 
} 
+0

gracias por la respuesta, pero no quiero invocar este método. Solo quiero que los desarrolladores definan algo con fuerte tipado. –

Cuestiones relacionadas