2013-08-04 18 views
6

是否有可能使用手動書寫的字符串獲得同一類中的另一種方法的名稱,但沒有如何從已知方法獲取methodname?

class MyClass { 

    private void doThis() 
    { 
     // Wanted something like this 
     print(otherMethod.name.ToString()); 
    } 

    private void otherMethod() 
    { 

    } 
} 

你可能會問,爲什麼:良好的原因是,我必須稍後調用的方法是這樣調用(「otherMethod」),但是我不想硬編碼此字符串自己是我不能重構它已經在項目中了。

+0

您可以使用反射來實現這一點。 –

+0

您使用的是什麼版本的C#? – Mehrdad

回答

8

一種方法是,你可以把它包裝成代表Action,那麼你就可以訪問方法的名字:

string name = new Action(otherMethod).Method.Name; 
+1

謝謝你的工作!該死的我看着GetType()和GetMethods(),但這個「新行動」,我從來沒有聽說過。小問題:當我使用新的Action時,我希望內部的方法不會被執行(它只需要名稱),那是對的嗎? – Malvin

+2

如果使用委託方法,您不需要獲取名稱(並因此通過反射跳過調用) - 稍後使用生成的「Action」來執行方法。 –

+2

哇!太棒了,我不知道你能做到這一點。 –

2

您可以使用反射(例如 - http://www.csharp-examples.net/get-method-names/),以獲得方法名。然後,您可以通過名稱,參數查找要查找的方法,甚至可以使用屬性來標記它。

但真正的問題是 - 你確定這是你所需要的?這看起來好像你並不真的需要反思,但需要考慮你的設計。如果你已經知道你要調用什麼方法,爲什麼你需要這個名字?如何使用委託?或者通過一個接口暴露這個方法並存儲一個實現它的類的引用?順便說一句

MethodInfo method = this.GetType().GetMethod("otherMethod"); 
object result = method.Invoke(this, new object[] { }); 
1

試試這個。我還發現(在互聯網的擴展中)只有獲得方法字符串的替代解決方案。它也適用於參數和返回類型:

System.Func<float, string> sysFunc = this.MyFunction; 
string s = sysFunc.Method.Name; // prints "MyFunction" 

public string MyFunction(float number) 
{ 
    return "hello world"; 
} 
0

+0

這是被接受的答案使用的方法。 – Servy

+0

唯一的區別是,這也適用於非void方法。 – Malvin

+0

該方法是相同的,您顯然需要使用匹配方法簽名的'Action' /'Func'類型。 OP中的例子是無參數的void函數,意思是「Action」。你*不能*使用'Func'這種方法。 – Servy