就像标题说的:反射能给你当前正在执行的方法的名字吗?

我倾向于认为不是,因为海森堡的问题。如何调用一个方法,在不改变当前方法的情况下告诉您当前方法?但我希望有人能证明我错了。

更新:

第2部分:这也可以用于在代码中查找属性吗? 第三部分:演出是什么样的?

最终结果 我学习了MethodBase.GetCurrentMethod()。我还了解到,我不仅可以创建堆栈跟踪,还可以只创建我需要的确切帧。

要在属性中使用它,只需使用. substring(4)来删除'set_'或'get_'。


当前回答

我只是用一个简单的静态类做了这个:

using System.Runtime.CompilerServices;
.
.
.
public static class MyMethodName
{
    public static string Show([CallerMemberName] string name = "")
    {
        return name;
    }
}

然后在代码中:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = MyMethodName.Show();
}

private void button2_Click(object sender, EventArgs e)
{
    textBox1.Text = MyMethodName.Show();
}

其他回答

为了同时处理异步和普通的旧方法调用,我这样做了。

在我的应用程序中,它只从异常处理程序调用,所以性能不是一个问题。

[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetCurrentMethodName()
{
    var st = new StackTrace();
    var sf = st.GetFrame(1);
    string name = sf.GetMethod().Name;

    if (name.Equals("MoveNext"))
    {
        // We're inside an async method
        name = sf.GetMethod().ReflectedType.Name
                 .Split(new char[] { '<', '>' }, StringSplitOptions.RemoveEmptyEntries)[0];
    }

    return name;
}

将此方法添加到某个地方,并不带参数地调用它!

public static string GetCurrentMethodName([System.Runtime.CompilerServices.CallerMemberName] string name = "")
{
    return name;
}

我只是用一个简单的静态类做了这个:

using System.Runtime.CompilerServices;
.
.
.
public static class MyMethodName
{
    public static string Show([CallerMemberName] string name = "")
    {
        return name;
    }
}

然后在代码中:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = MyMethodName.Show();
}

private void button2_Click(object sender, EventArgs e)
{
    textBox1.Text = MyMethodName.Show();
}

从。net 4.5开始,你也可以使用[CallerMemberName]。

示例:一个属性setter(回答第2部分):

protected void SetProperty<T>(T value, [CallerMemberName] string property = null)
{
    this.propertyValues[property] = value;
    OnPropertyChanged(property);
}

public string SomeProperty
{
    set { SetProperty(value); }
}

编译器将在调用点提供匹配的字符串字面量,因此基本上没有性能开销。

我认为你应该能够从创建一个StackTrace。或者,正如@edg和@Lars Mæhlum提到的,MethodBase.GetCurrentMethod()