我看到的是Implementing INotifyPropertyChanged - does a better way exist?(具体来说是公认的答案),这对于不需要或不使用基类的任何情况都很有效.然而,我想使用另一个接口来实现它,利用显式实现(https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation),以便允许实现类从其他基类继承而不修改所述基类.

我试着做了一些大致如下的事情:

    public interface INotifyPropertyChangedWithHelper : INotifyPropertyChanged
    {
        void SetProperty<T>(T value, ref T property, string propertyName)
        {
            if (!EqualityComparer<T>.Default.Equals(property, value))
            {
                property = value;
                OnPropertyChanged(propertyName);
            }
        }

        void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

但最后一行抛出错误CS0079(事件‘INotifyPropertyChanged.PropertyChanged’只能出现在+=-=的左侧).我之所以假设这一点,是因为除了实现它的类之外,不能从任何地方调用PropertyChanged,但是有什么方法可以解决这个问题吗?

如果答案是"不,您必须使用基类",那很好,但我希望以一种不妨碍使用其他基类的方式来工作.

推荐答案

您发布的代码的问题似乎与INotifyPropertyChanged接口中显式声明的PropertyChanged事件有关.当您try 从INotifyPropertyChangedWithHelper接口直接访问它时,编译器无法识别它,因为它是显式接口实现不能通过实现类直接访问.

以下是这个问题的解决方案:

public interface INotifyPropertyChangedWithHelper : INotifyPropertyChanged
{
    void SetProperty<T>(T value, ref T property, string propertyName);
}

public class ExampleClass : INotifyPropertyChangedWithHelper
{
    public event PropertyChangedEventHandler PropertyChanged;

    void INotifyPropertyChangedWithHelper.SetProperty<T>(T value, ref T property, string propertyName)
    {
        if (!EqualityComparer<T>.Default.Equals(property, value))
        {
            property = value;
            OnPropertyChanged(propertyName);
        }
    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}


通过显式实现INotifyPropertyChangedWithHelper.SetProperty,可以避免与其他基类的命名冲突,同时还可以显式实现INotifyPropertyChanged,从而确保PropertyChanged事件可在类中访问.

Csharp相关问答推荐

从LED面板中提取文本

在Linq中调用需要limit和offset的方法''''

什么是通过反射创建类的泛型接口方法的正确方法?

如何在C#中删除一个特殊字符,如"使用Regex"

如何注销Microsoft帐户?

此反射有什么问题.是否发送值转换委托?

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

限制特定REST API不被访问,但部署代码

应用程序启动器,可 Select 物理屏幕

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

.NET 8 DI GetServices<;对象&>不工作

当使用Dapper映射DBNull时,我可以抛出异常吗?

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

C#动态设置ServerReport报表参数

具有类型识别的泛型方法

如何强制新设置在Unity中工作?

如何在特定环境中运行dotnet测试?

EF Core 7-忽略模型绑定中的虚拟属性

在Unity C#中按键点击错误的参数

如何将行添加到DataGrid以立即显示它?