将变量设置为包含方法';的名字

本文关键字:方法 变量 设置 包含 | 更新日期: 2024-09-23 07:49:02

这看起来应该很简单,但我很难将其可视化。假设我有一个方法:

public Person person(string firstName, string lastName)
{
    //code and such
    string methodName = "Person person";
}

有没有一种方法可以创建一个变量并动态地将其设置为方法的名称?我需要这个,所以当我调用自定义异常方法时,我可以为日志记录设置有问题的方法的名称。如有任何帮助,我们将不胜感激。

将变量设置为包含方法';的名字

您可以使用这个:

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

如果你也想要类型,你可以使用:

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

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));
}