2013-12-07 198 views
3

我有一種情況,我將方法名稱作爲字符串傳遞給函數,但我不希望它硬編碼。 例如有沒有辦法在c#中動態獲取方法名?

void MyMethodName() 
{ 
    // some code 
} 

void SomeOtherMethod() 
{ 
    SomeExternalLibrary.ExternalClass.FunctionWithStringParameter("MyMethodName"); 
} 

我想是這樣的:

FunctionWithStringParameter(MyMethodName.ToString()); 

這樣我可以通過「查找所有引用」跟蹤方法調用的,我可以使用重構無後顧之憂。

+0

http://stackoverflow.com/questions/2968352/using-system-reflection-to-get-a-methods-full-name 可能的幫助。這就是說,如果你不想使用反射 - 你可以將字符串設置爲公共常量。 – Haedrian

+3

您傳遞方法名稱的原因是什麼?你是否通過名字查找來調用該方法?相反,嘗試使用委託或lambda表達式。 –

+0

我相信你正試圖解決錯誤的問題。如果您需要更好的重構支持,您應該使用像[ReSharper](http://www.jetbrains.com/resharper/)這樣的工具來幫助您重新命名和導航超出Visual Studio的能力範圍。 –

回答

5

也許最簡單的方法是提供一個可以將委託作爲參數的過載FunctionWithStringParameter

超載可能是簡單的:

void FunctionWithStringParameter(Action d) 
{ 
    FunctionWithStringParameter(d.Method.Name); 
} 

,並調用它是這樣的:

FunctionWithStringParameter(MyMethodName); 

要接受不同簽名的方法,你就必須要麼提供了許多不同的重載,或接受Delegate作爲參數,如下所示:

void FunctionWithStringParameter(Delegate d) 
{ 
    FunctionWithStringParameter(d.Method.Name); 
} 

不幸的是,我F你做到這一點,你必須通過指定一個委託類型來調用它:

FunctionWithStringParameter((Action)MyMethodName); 
+0

就是這樣,非常感謝。 –

2

這些天使用的一種技術是通過Expression

FunctionWithStringParameter(x => MyMethodName(x)); 

裏面你的方法,你可以挑選表達除了獲得被稱爲方法名(並檢查它是否是一個簡單的方法調用表達式)。

請參閱Retrieving Property name from lambda expression瞭解如何區分lambda表達式的想法。

+0

FunctionWithStringParameter在外部庫中。 –

0

我不知道你正在嘗試做的,但引用的方法和屬性,當一個方式,以避免「神奇字符串」是做什麼做的ASP.NET MVC助手方法做到這一點是這樣的:

@Html.TextBoxFor(m=> m.SomeProperty) 

,並做一些輔助性的,可以讓你做的事:

string methodName = ReflectionHelper.MethodNameFor<TheTypeWIthTheMethod>(x=> x.TheMethod()) 

的實施將看一些這樣的事情:

static string MethodNameFor<T>(Expression<Action<T>> expression) 
{ 
     return ((MethodCallExpression)expression.Body).Method.Name; 
} 
相關問題