为什么我不能从扩展方法调用PropertyChanged事件?

Vit*_*ova 15 c# wpf extension-methods propertychanged inotifypropertychanged

我试图编写一个类来避免像"RaisePropertyChanged"这样的方法.我知道我可以从具有该实现的类继承,但在某些情况下我不能.我尝试使用扩展方法,但Visual Studio抱怨.

public static class Extension
{
    public static void RaisePropertyChanged(this INotifyPropertyChanged predicate, string propertyName)
    {
        if (predicate.PropertyChanged != null)
        {
            predicate.PropertyChanged(propertyName, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它说:

"事件' System.ComponentModel.INotifyPropertyChanged.PropertyChanged'只能出现在+ =或 - =的左侧 "

Dan*_*Tao 20

里德是对的.但是,我看到你正在尝试做什么(让你的代码可以重用 - 对你有好处); 我只想指出,通常可以通过接受PropertyChangedEventHandler 委托本身并在INotifyPropertyChanged实现中传递它来轻松纠正:

public static void Raise(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
    if (handler != null)
    {
        handler(sender, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后从您实现的类中INotifyPropertyChanged,您可以像这样调用此扩展方法:

PropertyChanged.Raise(this, "MyProperty");
Run Code Online (Sandbox Code Playgroud)

这是因为,正如Marc所说,在声明事件的类中,您可以像字段一样访问它(这意味着您可以将它作为委托参数传递给方法,包括扩展方法).


Ree*_*sey 11

您只能从定义它的类中引发事件.

这一行:

predicate.PropertyChanged(propertyName, new PropertyChangedEventArgs(propertyName));
Run Code Online (Sandbox Code Playgroud)

将失败,因为predicate不是定义此扩展方法的类.

这部分原因通常是通过基类而不是使用Extension方法处理的.