如何提高派生类中属性的变化?

2024-04-16

我该如何提高PropertyChanged for SomeProperty在班上B?

此示例无法编译,因为PropertyChanged无法通过这种方式访问​​...

public class A : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
}

public class B : A
{
    private object _someProperty;

    public object SomeProperty
    {
        get => _someProperty;
        set
        {
            _someProperty = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SomeProperty)))
        }
    }
}

解决方案一:

你可以用这个RaisePropertyChangedExtension:

public static class RaisePropertyChangedExtension
{
    public static void RaisePropertyChanged(this INotifyPropertyChanged @this, [CallerMemberName] string propertyName = null)
    {
        var declaringType = @this.GetType().GetEvent(nameof(INotifyPropertyChanged.PropertyChanged)).DeclaringType;
        var propertyChangedFieldInfo = declaringType.GetField(nameof(INotifyPropertyChanged.PropertyChanged), BindingFlags.Instance | BindingFlags.NonPublic);
        var propertyChangedEventHandler = propertyChangedFieldInfo.GetValue(@this) as PropertyChangedEventHandler;
        propertyChangedEventHandler?.Invoke(@this, new PropertyChangedEventArgs(propertyName));
    }
}

像这样:

public class B : A
{
    private object _someProperty;

    public object SomeProperty
    {
        get => _someProperty;
        set
        {
            _someProperty = value;
            this.RaisePropertyChanged();
        }
    }
}

在我看来,这是迄今为止我所知道的最好的解决方案。

缺点是你可以提高PropertyChanged来自另一个类,如下所示:

public class C
{
    public C(B b)
    {
        b.RaisePropertyChanged(nameof(b.SomeProperty));
    }
}

这不是好的做法PropertyChanged从其他班级通过这种方式,所以我不担心这个缺点。

该解决方案的灵感来自托马斯·莱维斯克 https://stackoverflow.com/users/98713/thomas-levesque的回答在这里:简单的小型 INotifyPropertyChanged 实现 https://stackoverflow.com/a/3851173/7108481

解决方案2:

您可以创建一个受保护的RaisePropertyChanged在基类中A:

public class A : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

并调用派生类中的方法B:

public class B : A
{
    private object _someProperty;

    public object SomeProperty
    {
        get => _someProperty;
        set
        {
            _someProperty = value;
            RaisePropertyChanged();
        }
    }
}

缺点是你必须实施RaisePropertyChanged相反,您创建的每个新基类的方法可以避免以下缺点:解决方案1 had.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何提高派生类中属性的变化? 的相关文章

随机推荐