2015-08-30 45 views
2

我正在使用一個事件系統,它爲回調方法名稱提取一個字符串。我想避免硬編碼字符串。有沒有什麼辦法可以在運行時獲得給定類的方法名?如何在運行時獲取方法的名稱?

類似的東西來:

typeof(MyClass).Name; 

但方法將是完美的。

編輯:

我一直在谷歌上搜索這個問題,所有的結果似乎是找人來獲得當前執行方法的名稱。這不是我正在尋找的 - 而是我想在同一個類中獲得其他方法的名稱。

+0

也許你正在尋找[CallerMemberName(https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices。 callermembernameattribute%28V = vs.110%29.aspx)? –

+0

你能提供一個你有的示例代碼嗎? – Grundy

回答

2

聽起來好像你在談論的是在C#6.0中添加的nameof操作符。

MSDN Documentation

摘錄:

用於獲得簡單(不合格)字符串的變量,類型或成員的名稱。當報告代碼中的錯誤,連接模型 - 視圖 - 控制器(MVC)鏈接,觸發屬性更改的事件等時,通常需要捕獲方法的字符串名稱。使用nameof有助於在重命名定義時保持您的代碼有效。在必須使用字符串文字來引用定義之前,這在重命名代碼元素時很脆弱,因爲工具不知道要檢查這些字符串文字。

一個nameof表達了這種形式:

if (x == null) throw new ArgumentNullException(nameof(x)); 
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode」 
+0

只是一個說明,它在編譯時評估。 –

+0

感謝Smallhacker。不幸的是,我在2.0上,但這個答案絕對是最相關的。 – Vesuvian

1

您正在尋找

System.Reflection.MethodBase.GetCurrentMethod().Name; 

參考MethodBase.GetCurrentMethod Method

返回表示當前正在執行的 方法的MethodBase對象。

編輯:

var str = typeof(MyClass); 
MethodInfo[] info = str.GetMethods(BindingFlags.Public | BindingFlags.Instance); 
+0

我沒有使用當前的方法。我想用不同的方法。 – Vesuvian

+0

你的解決方案是正確的,但我不知道如果使用當前方法的名稱會影響編譯器優化。有時,編譯器會擺脫單次使用的方法。我不是說這是因爲你的解決方案,但一般來說,如果你嘗試使用當前的方法的鬃毛。 – Yogee

+1

@Vesuvian,請清楚你的問題。你是什​​麼意思'不同的方法「?如果您已經可以輸入方法名稱,只要您擔心「其他方法」,請將其保存爲字符串。 – Yogee

0

對於同樣的方法:

MethodBase.GetCurrentMethod().Name; 

對於方法在另一類:

var type = typeof(MyClass); 
MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Public | BindingFlags.Instance); 

然後,您可以使用,例如, methodInfos[0].Name到獲取方法的名稱。

如果要調用的方法是在同一個班級,你可以做到這一點,如下:如下

如果方法沒有返回類型/空

Action action =() => { MethodToBePassed(); }; 

    public static void MethodToBePassed() 
    { 
    } 

    public static void Test(string a, Action action) 
    { 
     action(); 
    } 

說它:

Test("a", action); 

如果方法有返回PARAM

Func<string, int> action = (str) => { return MethodToBePassed(str); }; 

public int MethodToBePassed(string sample) 
{ 
    return 1; 
} 

public static void Test(string a, Func<string, int> action) 
{ 
    int value = action("a"); 
} 
+0

謝謝,雖然這似乎不可靠。現在,不必確保字符串與方法匹配,我需要確保索引與方法位置匹配。 – Vesuvian

+0

@Vesuvian Nope,不依賴索引。GetMethods方法不會按特定順序返回方法,例如按字母順序或聲明順序。您的代碼不能依賴於返回方法的順序,因爲順序會有所不同。 –

+0

@Vesuvian檢查我的更新 –

相關問題