如何在C#pre版本6中获取调用当前方法的变量的名称

时间:2017-05-09 11:15:21

标签: c# .net reflection system.reflection

我们需要实施自定义软件分析来跟踪应用程序的使用情况。我们有一个共同的Command基类,所以我想知道是否有一些东西可以让我们知道哪个命令已被执行。

在WPF Window上考虑以下示例代码1 Button

public partial class MainWindow : Window
{
    private readonly Command _commandName = new Command();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _commandName.Execute();
    }
}

public class Command
{
    public void Execute()
    {
        MessageBox.Show(this.GetCommandName());
        // ....
    }

    private string GetCommandName()
    {
        string commandName = null;

        MethodBase method = new StackTrace(new StackFrame(2)).GetFrame(0).GetMethod();
        Type callingType = method.DeclaringType;

        if (callingType != null)
        {
            IList<FieldInfo> variables = callingType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.GetField | BindingFlags.Instance).Where(f => f.FieldType == typeof(Command)).ToList();

            if (variables.Count == 1)
            {
                commandName = variables[0].Name;
            }
        }

        return commandName;
    }
}

此代码将显示变量名称,但仅限于调用类型上有一个Command变量。有没有办法直接获取调用变量名称而不通过反射?

此代码的输出是(并且应该) _commandName 而非 Button_Click

1 个答案:

答案 0 :(得分:1)

尝试CallerMemberNameAttribute,例如

public void IDo([CallerMemberName] string methodName = null)
{
  // now methodName has the caller.
}