Как использовать CallerMemberName в CLS-совместимой сборке

Я использовал атрибут CallerMemberName в реализации класса INotifyPropertyChanged, как описано в MSDN следующим образом:

    public event PropertyChangedEventHandler PropertyChanged;

    // This method is called by the Set accessor of each property.
    // The CallerMemberName attribute that is applied to the optional propertyName
    // parameter causes the property name of the caller to be substituted as an argument.
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Однако использование параметров по умолчанию несовместимо с CLS. Но CallerMemberName можно использовать только с параметрами, имеющими значения по умолчанию... Существует ли широко используемый способ решения этой несогласованности без вызова метода уведомления с жестко заданным строковым аргументом?


person Toby    schedule 04.08.2017    source источник


Ответы (1)


Я просто удалил атрибут CallerMemberName и значение параметра по умолчанию, что означает, что параметр больше не является необязательным, поэтому сигнатура метода становится такой:

private void NotifyPropertyChanged(String propertyName)

Тогда это небольшое (достаточное) изменение, чтобы вызвать его с помощью оператора nameof, предоставляющего строковый аргумент:

NotifyPropertyChanged(nameof(FooProperty));

Кажется, это работает довольно хорошо.

Однако я оставлю вопрос открытым на некоторое время, поскольку у других могут быть лучшие способы или они могут предложить проблемы с этим решением.

person Toby    schedule 04.08.2017