从set“function”获取方法调用者

时间:2013-08-06 22:48:03

标签: c#

获取方法调用者,甚至通过使用编译器服务来更改属性名称非常简单,如下所示:

public class EmployeeVM:INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName=null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private string _name;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            // The compiler converts the above line to:
            // RaisePropertyChanged ("Name");
        }
    }

    private string _phone;

    public string Phone
    {
        get { return _phone; }
        set
        {
            _phone = value;
            OnPropertyChanged();
        // The compiler converts the above line to:
            // RaisePropertyChanged ("Phone");
        }
    }
} 

但是有可能从集合本身内部获取“set”函数的调用者吗?我不知道你是如何在该范围内进行语法定义的。 AKA,谁打电话给Phone =?

2 个答案:

答案 0 :(得分:2)

查看StackFrame,特别是GetMethod,它为您提供方法名称(您需要选择以前的堆栈帧之一,具体取决于编写辅助函数是否这样做)。文章中的样本:

            StackTrace st = new StackTrace();
            StackTrace st1 = new StackTrace(new StackFrame(true));
            Console.WriteLine(" Stack trace for Main: {0}",
               st1.ToString());
            Console.WriteLine(st.ToString());

通过搜索像How do I find the type of the object instance of the caller of the current function?

这样的StackFrame,可以找到其他类似的问题

答案 1 :(得分:1)

不幸的是[CallerMemberName] AttributeUsage设置为AttributeTargets.Parameter,因此它只能用于参数,例如方法签名

但您可以使用StackFrame提及的Alexei Levenkov

public string Phone
{
    get { return _phone; }
    set
    {
         string setterCallerName = new StackFrame(1).GetMethod().Name;

        _phone = value;
        OnPropertyChanged();
    }
}