2012-02-27 14 views
6

¿Es posible obtener un objeto MethodInfo desde un símbolo de método?Cómo obtener MethodInfo desde un símbolo de método

lo tanto, en la misma línea que:

typeof(SomeClassSymbol) // this gets you a Type object 

Esto es lo que quiero hacer:

public class Meatwad 
{ 
    MethodInfo method; 

    public Meatwad() 
    { 
     method = ReflectionThingy.GetMethodInfo(SomeMethod); 
    } 

    public void SomeMethod() { } 

} 

¿Cómo podría aplicar ReflectionThingy.GetMethodInfo? Dado que esto es incluso posible, ¿qué pasa con los métodos sobrecargados?

+1

Algo relacionado, creo: [En Foof We Trust] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue. aspx) –

Respuesta

2

Esto no es posible en C# directamente. Pero se puede construir usted mismo:

static MemberInfo MemberInfoCore(Expression body, ParameterExpression param) 
    { 
     if (body.NodeType == ExpressionType.MemberAccess) 
     { 
      var bodyMemberAccess = (MemberExpression)body; 
      return bodyMemberAccess.Member; 
     } 
     else if (body.NodeType == ExpressionType.Call) 
     { 
      var bodyMemberAccess = (MethodCallExpression)body; 
      return bodyMemberAccess.Method; 
     } 
     else throw new NotSupportedException(); 
    } 

    public static MemberInfo MemberInfo<T1>(Expression<Func<T1>> memberSelectionExpression) 
    { 
     if (memberSelectionExpression == null) throw new ArgumentNullException("memberSelectionExpression"); 
     return MemberInfoCore(memberSelectionExpression.Body, null/*param*/); 
    } 

Y utilizar de esta manera:

var methName = MemberInfo(() => SomeMethod()).MethodName; 

que le proporcionará el tiempo de compilación de seguridad. El rendimiento no será bueno sin embargo.

+0

¿Por qué su método tiene un parámetro que nunca se usa? – svick

+0

Copié esto de una clase auxiliar que tiene 200 LOC. Solo quería darles la esencia. Por favor trátelo como pseudocódigo ;-) La idea, sin embargo, funcionará completamente. – usr

+2

@usr Cuando el rendimiento se convierte en un problema, se soluciona fácilmente al usar esto para inicializar objetos de solo lectura estáticos, en lugar de llamar a su función cada vez. – hvd

7

Los delegados contienen el MethodInfo que desea en su Method property. Por lo que su método de ayuda podría ser tan simple como:

MethodInfo GetMethodInfo(Delegate d) 
{ 
    return d.Method; 
} 

No es posible convertir directamente de un grupo método para Delegate. Pero puedes usar un molde para eso. Ej .:

GetMethodInfo((Action)Console.WriteLine) 

Tenga en cuenta que esto no funcionará si intenta mezclarlo con algo así como la solución de usr. Por ejemplo

GetMethodInfo((Action)(() => Console.WriteLine())) 

devolverá el MethodInfo para el método anónimo generado, no para Console.WriteLine().

+0

Me gusta hasta ahora lo mejor, pero lo interesante es que puede construir una acción con solo el símbolo del método y obtener MethodInfo desde la propiedad Method de la Acción. Eso es en última instancia, lo que estaba tratando de aprender a hacer. Si tengo algo de tiempo, descompilaré Acción para ver qué está pasando. –

Cuestiones relacionadas