将变量设置为包含方法的名称

问题描述:

这应该看起来很简单,但我有时间想象它。可以说我有一个方法:将变量设置为包含方法的名称

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

    string methodName = "Person person"; 
} 

有没有办法创建一个变量并将其设置为方法的名称动态?我需要这个,所以当我调用自定义的异常方法时,我可以设置违规方法的名称进行日志记录。任何帮助,将不胜感激。如果你想要的类型太

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

,你可以使用:

+0

反射是要走的路。 – everton

+0

是否有理由需要这个? – Ric

+0

你需要返回类型空间名称还是方法名? –

您可以使用此

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

我和你的答案一起去了,因为错误处理程序已经为我写了,我只是收紧代码,所以这个效果很好。话虽如此,你还提供了其他有用的代码,我可以在其他地方加入。 –

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

另一种解决方法,如果使用的是.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

是的,我没有提到,最初是因为他们要求**当前**方法的名称。但我同意这对记录目的更好。 –