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

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

更新:

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

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

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


当前回答

在空控制台程序的Main方法中试试这个:

MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);

控制台输出: 主要

其他回答

试试这个…

    /// <summary>
    /// Return the full name of method
    /// </summary>
    /// <param name="obj">Class that calls this method (use Report(this))</param>
    /// <returns></returns>
    public string Report(object obj)
    {
        var reflectedType = new StackTrace().GetFrame(1).GetMethod().ReflectedType;
        if (reflectedType == null) return null;

        var i = reflectedType.FullName;
        var ii = new StackTrace().GetFrame(1).GetMethod().Name;

        return string.Concat(i, ".", ii);
    }

编辑:MethodBase可能是一种更好的方法,只获取你所在的方法(而不是整个调用堆栈)。然而,我仍然担心内联。

你可以在方法中使用StackTrace:

StackTrace st = new StackTrace(true);

看看这些画框:

// The first frame will be the method you want (However, see caution below)
st.GetFrames();

但是,请注意,如果方法是内联的,则您将不在您认为的方法中。你可以使用一个属性来防止内联:

[MethodImpl(MethodImplOptions.NoInlining)]

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

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

对于异步方法,你可以使用:

//using System.Reflection;

var myMethodName = MethodBase
                    .GetCurrentMethod()
                    .DeclaringType
                    .Name
                    .Substring(1)
                    .Split('>')[0];

在空控制台程序的Main方法中试试这个:

MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);

控制台输出: 主要