C#-事件和接口

C#-事件和接口,c#,events,interface,C#,Events,Interface,我有一个带有多个事件的界面 我有base类实现接口 我有第三个扩展基类的类(我们称之为混凝土类) 问题:当我执行以下操作时:IMyInterface i=newtheConcreteclass(),然后订阅任何事件(i.someEvent+=some_handler),事件处理程序从未调用,因为(可能)事件订阅被分配给基类而不是具体类,即使新的()运算符创建了具体类 希望事情清楚:) 有什么建议吗 谢谢, 阿迪·巴尔达你所描述的应该如预期的那样有效 您是否在隐藏基本实现的具体类中再次声明了事件

我有一个带有多个事件的界面 我有base类实现接口
我有第三个扩展基类的类(我们称之为混凝土类)

问题:当我执行以下操作时:IMyInterface i=newtheConcreteclass(),然后订阅任何事件(i.someEvent+=some_handler),事件处理程序从未调用,因为(可能)事件订阅被分配给基类而不是具体类,即使新的()运算符创建了具体类

希望事情清楚:)
有什么建议吗

谢谢,
阿迪·巴尔达

你所描述的应该如预期的那样有效

您是否在隐藏基本实现的具体类中再次声明了事件

您的代码应该是:

public interface IInterface
{
    event EventHandler TestEvent;
}

public class Base : IInterface
{
    public event EventHandler TestEvent;
}

public class Concrete : Base
{
   //Nothing needed here
}

要回答您的评论:

标准做法是在基类上放置一个方法:

public class Base : IInterface
{
    public event EventHandler TestEvent;

    protected virtual void OnTestEvent()
    {
        if (TestEvent != null)
       {
           TextEvent(this, EventArgs.Empty);
       }
    }
}

public class Concrete : Base
{
   public void SomethingHappened()
   {
       OnTestEvent();
   }
}
此模式有助于集中用于触发事件、测试空值等的任何逻辑,并通过重写该方法,使其易于与子类中触发事件的时间挂钩。

您所描述的内容应按预期工作

您是否在隐藏基本实现的具体类中再次声明了事件

您的代码应该是:

public interface IInterface
{
    event EventHandler TestEvent;
}

public class Base : IInterface
{
    public event EventHandler TestEvent;
}

public class Concrete : Base
{
   //Nothing needed here
}

要回答您的评论:

标准做法是在基类上放置一个方法:

public class Base : IInterface
{
    public event EventHandler TestEvent;

    protected virtual void OnTestEvent()
    {
        if (TestEvent != null)
       {
           TextEvent(this, EventArgs.Empty);
       }
    }
}

public class Concrete : Base
{
   public void SomethingHappened()
   {
       OnTestEvent();
   }
}

此模式有助于集中用于触发事件、测试空值等的逻辑,并通过重写该方法,使其易于连接到子类中触发事件的时间。

请发布一个小示例,演示您的问题,以便我们能够提供帮助-谢谢!我看不出你所描述的有任何问题。你如何触发你的事件?你能给我们看一个代码示例吗?请发布一个小示例来演示你的问题,以便我们能够提供帮助-谢谢!我看不出你所描述的有任何问题。你如何触发你的事件?您能给我们看一个代码示例吗?那么我如何从具体类中调用该事件呢?this.TestEvent()或base.TestEvent()-任何适合您需要的东西。@Adi,您只能从声明该事件的类中触发该事件。这就是为什么许多实现提供了一个名为OnEventName的受保护方法(只能从继承者处访问),该方法将使用事件参数触发事件=null,无法调用事件-您的答案错误(未编译)。我想知道微软为什么要设置这样的限制。当我意识到自己很愚蠢,而且它无法编译时,我编辑了我的答案。限制的原因是允许两层访问控制,一层用于注册事件(公共事件本身),另一层用于触发事件(私有默认值或添加的受保护方法)。如果您只需要访问事件就可以触发它,那么任何类都可以触发任何事件。但是如何从具体类中调用该事件呢?this.TestEvent()或base.TestEvent()-任何适合您需要的内容。@Adi,您只能从声明该事件的类中触发该事件。这就是为什么许多实现提供了一个名为OnEventName的受保护方法(只能从继承者处访问),该方法将使用事件参数触发事件=null,无法调用事件-您的答案错误(未编译)。我想知道微软为什么要设置这样的限制。当我意识到自己很愚蠢,而且它无法编译时,我编辑了我的答案。限制的原因是允许两层访问控制,一层用于注册事件(公共事件本身),另一层用于触发事件(私有默认值或添加的受保护方法)。如果您只需要访问事件就可以触发它,那么任何类都可以触发任何事件。