2013-12-12 41 views
2

這應該看起來很簡單,但我有時間想象它。可以說我有一個方法:將變量設置爲包含方法的名稱

public Person person(string firstName, string lastName) 
{ 
    //code and such 

    string methodName = "Person person"; 
} 

有沒有辦法創建一個變量並將其設置爲方法的名稱動態?我需要這個,所以當我調用自定義的異常方法時,我可以設置違規方法的名稱進行日誌記錄。任何幫助,將不勝感激。如果你想要的類型太

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

,你可以使用:

+0

反射是要走的路。 – everton

+0

是否有理由需要這個? – Ric

+0

你需要返回類型空間名稱還是方法名? –

回答

7

您可以使用此

var method = System.Reflection.MethodBase.GetCurrentMethod(); 
var methodName = string.Format("{0} {1}", method.DeclaringType.Name, method.Name); 

編輯:現在,我看到你寫的日誌記錄功能,您可能想從MSDN文檔中嘗試如下所示:

public void DoProcessing() 
{ 
    TraceMessage("Something happened."); 
} 

public void TraceMessage(string message, 
     [CallerMemberName] string memberName = "", 
     [CallerFilePath] string sourceFilePath = "", 
     [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    Trace.WriteLine("message: " + message); 
    Trace.WriteLine("member name: " + memberName); 
    Trace.WriteLine("source file path: " + sourceFilePath); 
    Trace.WriteLine("source line number: " + sourceLineNumber); 
} 

[CallerMemberName]屬性指示編譯器應該在調用函數中傳遞。這使得它比使用反射更快。看看這個鏈接獲取更多信息:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx

+0

「System.Reflection.MethodInfo.GetCurrentMethod()。Name」和您提供的答案有什麼不同? – Ric

+0

不,它是一個靜態方法,所以你調用它的類型並不重要......無論是從MethodBase調用它。 –

+0

我和你的答案一起去了,因爲錯誤處理程序已經爲我寫了,我只是收緊代碼,所以這個效果很好。話雖如此,你還提供了其他有用的代碼,我可以在其他地方加入。 –

4
string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name; 
2

另一種解決方法,如果使用的是.NET 4.5中使用CallerMemberName屬性。

public class Example 
{ 
    public void Foo() 
    { 
     Bar(); 
    } 

    private void Bar([CallerMemberName] string caller = null) 
    { 
     Console.WriteLine(caller); //Writes "Foo" 
    } 
} 

它不會給你你所在的函數的名字,而是你調用函數的名字。我不知道這對您的例外處理程序是否有用,但它對於實施可能非常有用INotifyPropertyChanged

private string _exampleProperty; 

public String ExampleProperty 
{ 
    get { return _exampleProperty; } 
    set 
    { 
     if (value == _exampleProperty) return; 
     _exampleProperty = value; 
     OnPropertyChanged(); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
} 
+0

是的,我沒有提到,最初是因爲他們要求**當前**方法的名稱。但我同意這對記錄目的更好。 –