获取方法调用方设置“函数”

本文关键字:函数 设置 方法 调用 方设置 获取 | 更新日期: 2023-09-27 18:26:43

获取

方法调用器非常简单,甚至可以使用编译器服务更改属性名称,如下所示:

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"函数的调用者?我不知道你如何在语法上定义它。又名,谁在打电话 电话= ?

获取方法调用方设置“函数”

看看 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());
通过

搜索 StackFrame 可以找到其他类似的问题,例如如何找到当前函数调用者的对象实例的类型?

不幸的是[CallerMemberName] AttributeUsage设置为AttributeTargets.Parameter,所以它只能用于参数,就像在方法签名中一样

但是您可以使用Alexei Levenkov提到的StackFrame

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