我尝试编写一个类来避免使用像“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));
}
}
}
它说:
"The event 'System.ComponentModel.INotifyPropertyChanged.PropertyChanged' can only appear on the left hand side of += or -="
最佳答案
Reed是对的。但是,我明白你在做什么(让你的代码可重用——对你有好处);我只想指出,通过接受 PropertyChangedEventHandler
delegate 本身并从 INotifyPropertyChanged
实现中传递它,通常可以很容易地纠正这个问题:
public static void Raise(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
if (handler != null)
{
handler(sender, new PropertyChangedEventArgs(propertyName));
}
}
然后在实现了 INotifyPropertyChanged
的类中,您可以像这样调用这个扩展方法:
PropertyChanged.Raise(this, "MyProperty");
之所以有效,是因为 as Marc said ,在声明事件的类中,您可以像访问字段一样访问它(这意味着您可以将它作为委托(delegate)参数传递给方法,包括扩展方法)。
关于c# - 为什么我不能从扩展方法调用 PropertyChanged 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925106/