我们需要实施自定义软件分析来跟踪应用程序的使用情况。我们有一个共同的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 。
答案 0 :(得分:1)
尝试CallerMemberNameAttribute
,例如
public void IDo([CallerMemberName] string methodName = null)
{
// now methodName has the caller.
}