1

次のように、コンパイラ サービスを使用して、メソッドの呼び出し元を取得したり、プロパティ名の変更を取得したりするのは非常に簡単です。

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

しかし、セット自体の内部から「セット」関数の呼び出し元を取得することは可能ですか? そのスコープで構文的にどのように定義するかわかりません。別名、Phone= を呼び出しているのは誰ですか?

4

2 に答える 2

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();
    }
}
于 2013-08-06T23:09:54.260 に答える