无法从局部类调用事件

问题描述

我具有以下类结构:

    public abstract class Base : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    }
    
    internal partial class ImplBase : Base {
    }
    
    internal partial class ImplBase {
        void someFunc(){
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("propName"));
        }
    }

为什么语言不允许从局部类引发事件?

在此处查看代码段:https://dotnetfiddle.net/k8catR

解决方法

与它是局部类没有任何关系。它与您尝试从未定义的类中提高偶数有关。下面没有任何错误。

public partial class Base : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;


}

public partial class Base
{
    protected void RaiseEvent(string propertyName)
    {
        PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("propertyName"));
    }
}

internal partial class ImplBase : Base
{
}

internal partial class ImplBase
{
    void someFunc()
    {
        RaiseEvent("propName");
    }
}
,

您可以在没有部分类的情况下重现错误编译:

public abstract class Base : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
}

internal class ImplBase : Base
{
    void someFunc()
    {
        PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("propName"));
    }
}

此代码具有相同的错误消息,它不是部分类限制。这是一个传统限制:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-raise-base-class-events-in-derived-classes

当创建一个可用作其他类的基类的类时,应考虑以下事实:事件是一种特殊类型的委托,只能从声明它们的类中调用。派生类不能直接调用在基类中声明的事件。尽管有时您可能想要一个只能由基类引发的事件,但在大多数情况下,应启用派生类以调用基类事件。为此,您可以在包装事件的基类中创建一个受保护的调用方法。通过调用或重写此调用方法,派生类可以间接调用事件。

您需要在声明事件的类中引发事件。您可以在方法中执行此操作,然后在子类中重用该方法:

public abstract class Base : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

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

internal partial class ImplBase : Base
{ }

internal partial class ImplBase
{
    void someFunc()
    {
        RaisePropertyChanged("propName");
    }
}