Есть ли способ написать канонический метод OnPropertyChanged в качестве метода расширения? - PullRequest
0 голосов
/ 23 мая 2009

В основном я хочу сделать что-то вроде этого:

public static void OnPropertyChanged(this INotifyPropertyChanged changedObject, string propertyName)
{
    var handler = changedObject.PropertyChanged;
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(changedObject, e);
    }
}

, что дает "System.ComponentModel.INotifyPropertyChanged.PropertyChanged может использоваться только в левой части + = или - ="

Я имею в виду, я могу обойти это, сделав это:

public static void RaisePropertyChanged(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(sender, e);
    }
}

но вызывающий код выглядит не так хорошо:

PropertyChanged.RaisePropertyChanged(this, "Name");

против этого:

this.OnPropertyChanged("Name");

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

1 Ответ

1 голос
/ 24 мая 2009

Это также противоречит рекомендациям: методы * в общем предназначены для того, чтобы делать вещи, основанные на том, что ВНУТРИ реализующего экземпляра. Как правило, эти методы являются виртуальными, поэтому вы можете переопределить их в производных классах. Поэтому иметь внешний метод On * не имеет смысла. Если вы хотите вызвать событие без повсеместного страшного нулевого теста, вам действительно следует использовать метод расширения RaiseEvent (). Я написал много из них, все с перегрузками, так что вы можете просто использовать RaiseEvent (...), и вам не нужно включать имя события в метод. Это особенно легко в случаях, когда вы, например, используете обычный тип EventHandler, поэтому вы можете использовать тот же метод расширения для большего количества событий.

...