在接收端使用基于lambda的签入INotifyPropertyChanged

bja*_*vor 5 c# lambda inotifypropertychanged

关于如何使用lambda表达式来引发INotifyPropertyChanged事件以重构自由代码,有大量代码和示例.这通常用作:

NotifyOfPropertyChanged(() => PropertyName);
Run Code Online (Sandbox Code Playgroud)

我的问题是,你如何在事物的接收端实现类似的东西,在那里你通常会有一些类型的switch语句:

private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case "XYZ":
            break;
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在以某种方式避免在这里使用字符串会很好,以便在更改属性名称时不会破坏...

作为目前的中途解决方案,我只使用具有公共常量的嵌入式类,例如:

public class MyClass
{
    public static class Notifications
    {
        public const string Property1 = "Property1"
        //...
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后在接收端:

private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case MyClass.Notifictions.Property1:
            break;
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

这比纯字符串要好一些,因为它们只需要在一个地方维护,并且在同一个类中,你也可以对属性名称进行任何更改,但仍然不是一个非常令人满意的解决方案......

有人知道更好的方法吗?

i3a*_*non 0

这取决于您对房产的实际需求。假设您想要更改后的属性的值,您可以使用以下方法reflection来获取它:

private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
    object value = 
        sender.GetType().GetProperty(args.PropertyName).GetValue(sender, null);
}
Run Code Online (Sandbox Code Playgroud)

如果您的需求没有得到满足,reflection您仍然可以使用字符串比较,而不必担心属性名称会发生​​变化,方法与您在方法中使用的机制相同NotifyPropertyChanged。如果你不使用,你可以使用我的(代码在这里):

private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
    if (args.PropertyName == ExtendedObject.GetPropertyName(_ => _.Property1)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)