2012-02-27 73 views
6

是否可以從方法符號中獲取MethodInfo對象?如何從方法符號中獲取MethodInfo

所以在同樣爲:

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

這是我想做的事:

public class Meatwad 
{ 
    MethodInfo method; 

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

    public void SomeMethod() { } 

} 

我怎麼能實現ReflectionThingy.GetMethodInfo?鑑於這甚至是可能的,那麼重載方法呢?

+1

有點相關,我覺得:[在Foof We Trust](http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue。 aspx) – 2012-02-27 18:09:36

回答

2

這在C#中是不可能的。但是,你可以建立這個自己:

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

而且使用這樣的:

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

,將提供編譯時的安全性。性能不會好。

+0

爲什麼你的方法有一個永遠不會使用的參數? – svick 2012-02-27 17:54:38

+0

我從一個有200 LOC的幫助類中複製出來。我只是想給出它的要點。請把它當作僞代碼;-)然而,這個想法完全可行。 – usr 2012-02-27 17:55:35

+2

@usr當性能成爲問題時,通過使用它來初始化靜態只讀對象很容易,而不是每次調用您的函數。 – hvd 2012-02-27 18:07:10

7

代表包含您想要的MethodInfoMethod property

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

您不能直接從方法組轉換爲Delegate:所以作爲輔助方法,可能是那樣簡單。但你可以使用一個演員。例如:

GetMethodInfo((Action)Console.WriteLine) 

請注意,如果您嘗試將它與usr的解決方案混合使用,這將不起作用。例如

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

將返回MethodInfo用於產生匿名方法,不爲Console.WriteLine()

+0

到目前爲止,我最喜歡這種方式,但有趣的是,您可以僅使用方法符號構造一個動作,並從Action的Method屬性中獲取MethodInfo。這正是我試圖學習如何去做的最終目標。如果我有一些時間,我會反編譯Action來看看發生了什麼。 – 2012-02-27 18:10:24

相關問題