2012-01-26 21 views
7

estoy tratando de poner en práctica la función siguiente patrón:¿Extraer el nombre del método del árbol de expresiones?

MethodInfo GetMethod(  
    Expression<Func<TTarget, EventHandler<TEventArgs>>> method) 

puedo proporcionar una instancia de TTarget si se requiere

El uso deseado es:

public static void Main(string[] args) 
{ 
    var methodInfo = GetMethod<Program, EventArgs>(t => t.Method); 
    Console.WriteLine("Hello, world!"); 
} 

private void Method(object sender, EventArgs e) 
{ 
} 

Aquí es lo que he intentado hasta ahora:

private static MethodInfo GetMethod(TTarget target, Expression<Func<TTarget, EventHandler<TEventArgs>>> method) 
{ 
    var lambda = method as LambdaExpression; 
    var body = lambda.Body as UnaryExpression; 
    var call = body.Operand as MethodCallExpression; 
    var mInfo = call.Method as MethodInfo; 

    Console.WriteLine(mInfo); 

    throw new NotImplementedException(); 
} 

Imprime:

System.Delegate CreateDelegate(System.Type, System.Object, System.Reflection.Met hodInfo)

+0

Puede ser útil etiquetar la pregunta con el lenguaje de programación que está utilizando. Parece C# pero no puedo estar seguro. – styfle

Respuesta

5

Usted es la mitad del camino. Mira el código de abajo

public static void Main(string[] args) 
{ 
    var program = new Program(); 
    var methodInfo = GetMethod<Program, EventArgs>(()=> program.Method); 
    Console.WriteLine(methodInfo.Name); 
} 

Y utilizar el siguiente código para obtener el nombre del método.

static MethodInfo GetMethod<TTarget, TEventArgs>(Expression<Func<EventHandler<TEventArgs>>> method) where TEventArgs:EventArgs 
{ 
    var convert = method.Body as UnaryExpression; 
    var methodCall = (convert.Operand as MethodCallExpression); 
    if (methodCall != null && methodCall.Arguments.Count>2 && methodCall.Arguments[2] is ConstantExpression) 
    { 
     var methodInfo = (methodCall.Arguments[2]as ConstantExpression).Value as MethodInfo; 
     return methodInfo; 
    } 
    return null; 
} 

Espero que responda a su pregunta.

+0

Gracias. ¡eso hizo el trabajo! – Shimmy

Cuestiones relacionadas