我正在使用一個事件系統,它爲回調方法名稱提取一個字符串。我想避免硬編碼字符串。有沒有什麼辦法可以在運行時獲得給定類的方法名?如何在運行時獲取方法的名稱?
類似的東西來:
typeof(MyClass).Name;
但方法將是完美的。
編輯:
我一直在谷歌上搜索這個問題,所有的結果似乎是找人來獲得當前執行方法的名稱。這不是我正在尋找的 - 而是我想在同一個類中獲得其他方法的名稱。
我正在使用一個事件系統,它爲回調方法名稱提取一個字符串。我想避免硬編碼字符串。有沒有什麼辦法可以在運行時獲得給定類的方法名?如何在運行時獲取方法的名稱?
類似的東西來:
typeof(MyClass).Name;
但方法將是完美的。
編輯:
我一直在谷歌上搜索這個問題,所有的結果似乎是找人來獲得當前執行方法的名稱。這不是我正在尋找的 - 而是我想在同一個類中獲得其他方法的名稱。
聽起來好像你在談論的是在C#6.0中添加的nameof
操作符。
摘錄:
用於獲得簡單(不合格)字符串的變量,類型或成員的名稱。當報告代碼中的錯誤,連接模型 - 視圖 - 控制器(MVC)鏈接,觸發屬性更改的事件等時,通常需要捕獲方法的字符串名稱。使用nameof有助於在重命名定義時保持您的代碼有效。在必須使用字符串文字來引用定義之前,這在重命名代碼元素時很脆弱,因爲工具不知道要檢查這些字符串文字。
一個nameof表達了這種形式:
if (x == null) throw new ArgumentNullException(nameof(x));
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode」
只是一個說明,它在編譯時評估。 –
感謝Smallhacker。不幸的是,我在2.0上,但這個答案絕對是最相關的。 – Vesuvian
您正在尋找
System.Reflection.MethodBase.GetCurrentMethod().Name;
參考MethodBase.GetCurrentMethod Method
返回表示當前正在執行的 方法的MethodBase對象。
編輯:
var str = typeof(MyClass);
MethodInfo[] info = str.GetMethods(BindingFlags.Public | BindingFlags.Instance);
對於同樣的方法:
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");
}
謝謝,雖然這似乎不可靠。現在,不必確保字符串與方法匹配,我需要確保索引與方法位置匹配。 – Vesuvian
@Vesuvian Nope,不依賴索引。GetMethods方法不會按特定順序返回方法,例如按字母順序或聲明順序。您的代碼不能依賴於返回方法的順序,因爲順序會有所不同。 –
@Vesuvian檢查我的更新 –
也許你正在尋找[CallerMemberName(https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices。 callermembernameattribute%28V = vs.110%29.aspx)? –
你能提供一個你有的示例代碼嗎? – Grundy