2013-04-02 138 views
2

我想做一些相當簡單的事情,但不確定是否有任何方法只需創建我的類的虛擬實例。獲取靜態方法內的非靜態方法名稱

我試圖用一些簡單的代碼來簡單地得到一個非靜態方法的方法名稱:

static string GetMethodName(Func<string, int> function ) 
     { 
      return function.Method.Name; 
     } 

但是我想從MyStaticMethod像這樣,當然這是抱怨稱這樣的:

private static void MyStaticMethod() 
{ 
    var a = GetMethodName(MyNonStaticMethod); 
} 


private int MyNonStaticMethod(string param1) 
{ 
    return 0; 
} 

有沒有什麼辦法可以在不創建包含類的虛擬實例的情況下完成此任務?顯然我的情況更復雜,我不能簡單地讓我的非靜態方法靜態(它需要一個實例並具有依賴關係綁定)。只是想知道這是否可能,因爲我需要的只是名稱(所以實際上不需要實例)。我試圖擺脫魔法字符串,並且在事情發生變化時想要一些編譯時錯誤。

編輯:我創建了一個靜態輔助類

我有一個通用的方法:

public static string GetMemberName<T>(
       Expression<Func<T, object>> expression) 
      { 
       if (expression == null) 
       { 
        throw new ArgumentNullException("expression"); 
       } 

       return _GetMemberName(expression.Body); 
      } 

private static string _GetMemberName(
      Expression expression) 
     { 
      if (expression is MemberExpression) 
      { 
       var memberExpression = 
        (MemberExpression)expression; 
       return memberExpression.Member.Name; 
      } 

      if (expression is MethodCallExpression) 
      { 
       var methodCallExpression = (MethodCallExpression)expression; 
       return methodCallExpression.Method.Name; 
      } 

      if (expression is UnaryExpression) 
      { 
       var unaryExpression = (UnaryExpression)expression; 
       return GetMemberName(unaryExpression); 
      } 

      throw new ArgumentException("Unrecognized expression"); 
     } 
+0

請標記相關語言 –

+2

本質上你問:_how我可以創建一個'Func '委託,指向一個實例方法,但沒有任何特定的實例嗎?_ – Virtlink

+0

以及..當然,我不需要委託,如果我可以只是通過其他一些方法學獲得方法名稱,只是發佈我爲了清晰起見而要做的事情。我明白你要去哪裏,很明顯,如果有解決方案,它不能使用實際的實例方法。我真的只想做MyNonStaticMethod.ToString()!!! – Zom

回答

2

當然,你可以做到這一點。使用Expression<Func<YourInstanceClass, TReturn>>這樣的:

static string GetMethodName<TReturn>(Expression<Func<YourInstanceClass, TReturn>> function) 
{ 
    var call = function.Body as MethodCallExpression; 
    return call != null ? call.Method.Name : "not a single call expression"; 
} 

現在你可以

var name = GetMethodName(a => a.MyNonStaticMethod("1")); 

Console.WriteLine (name); //prints MyNonStaticMethod 

其中

public class YourInstanceClass 
{ 
    public int MyNonStaticMethod(string param1) 
    { 
     return 0; 
    } 
} 

我做了MyNonStaticMethod公衆,讓我可以在外面調用它,但你可以離開它私人和在一個類裏面用靜態方法調用它

+0

哈!謝謝你不要叫我dumba **(正如其他答覆似乎暗示)。是的,這正是我想要做的。我需要刷上我的表情樹khowledge,謝謝你讓我的頭腦正確! – Zom

+0

請注意,這需要創建虛擬參數(而不是類的虛擬實例)。如果您仍想使用原始方法的類的虛擬實例,則可以使用[FormatterServices.GetUnitializedObject](http:/ /msdn.microsoft.com/en-us/library/system.runtime.serialization.formatterservices.getuninitializedobject.aspx)創建一個實例,而無需運行構造函數或初始化任何字段。 –

+0

@DanBryant感謝您的留言。選擇兩個邪惡 - 虛擬參數和未初始化的對象,我會首先選擇。但無論如何,謝謝你的提示 –