C# 类型实现接口的对象的引发事件

C# 类型实现接口的对象的引发事件,c#,.net,events,interface,C#,.net,Events,Interface,我在尝试引发对象的事件时遇到了一个问题,该对象的类型实现了另一个类的接口(事件所在的位置) 这是我的密码: 界面IBaseForm public interface IBaseForm { event EventHandler AfterValidation; } public partial class ContactForm : IBaseForm { //Code ... public event EventHandler AfterValidation; }

我在尝试引发对象的事件时遇到了一个问题,该对象的类型实现了另一个类的接口(事件所在的位置)

这是我的密码:

界面IBaseForm

public interface IBaseForm
{
    event EventHandler AfterValidation;
}
public partial class ContactForm : IBaseForm
{
    //Code ...

    public event EventHandler AfterValidation;
}
实现接口IBaseForm的表单

public interface IBaseForm
{
    event EventHandler AfterValidation;
}
public partial class ContactForm : IBaseForm
{
    //Code ...

    public event EventHandler AfterValidation;
}
我的控制器:这里发生错误

错误消息:

事件AfterValidation只能出现在 +=或-=(在IBaseForm类型中从whithin使用时除外)


提前感谢

您不能从定义类之外引发事件

您需要在界面上创建
Raise()
方法:

public interface IBaseForm
{
    event EventHandler AfterValidation;

    void RaiseAfterValidation();
}

public class ContactForm : IBaseForm
{
    public event EventHandler AfterValidation;

    public void RaiseAfterValidation()
    {
        if (AfterValidation != null)
            AfterValidation(this, new EventArgs());
    }
}
在控制器中:

protected void Validation()
{
    CurrentForm.RaiseAfterValidation();
}

但是,如果您想从定义类外部触发事件,那么它通常是一种设计味道。。。通常,
IBaseForm
实现中应该有一些触发事件的逻辑。

您不能从定义类之外引发事件

您需要在界面上创建
Raise()
方法:

public interface IBaseForm
{
    event EventHandler AfterValidation;

    void RaiseAfterValidation();
}

public class ContactForm : IBaseForm
{
    public event EventHandler AfterValidation;

    public void RaiseAfterValidation()
    {
        if (AfterValidation != null)
            AfterValidation(this, new EventArgs());
    }
}
在控制器中:

protected void Validation()
{
    CurrentForm.RaiseAfterValidation();
}
但是,如果您想从定义类外部触发事件,那么它通常是一种设计味道。。。通常,
IBaseForm
实现中应该有一些触发事件的逻辑。

基本上是.NET中的一个结构,它标识了两种方法--
添加方法和
删除方法;其中每一个都接受一个参数作为参数

虽然事件通常与方法一起使用,这些方法将传入的委托合并到类型为
的字段,或从中删除传入的委托,但这是一个实现细节。虽然创建事件的正常目的是在某些情况下,让他们希望调用的其他代码传入委托,但.NET中的事件机制并不关心传入委托的处理方式

在某些情况下,与事件相关联的
add
remove
方法可以完全合法和合乎逻辑地丢弃传入的委托。例如,不可变的集合类型可能实现
(以便于与控件一起使用,该控件应根据需要自动更新以显示当前集合状态),但放弃传递给更新通知事件的任何委托。如果集合永远不会被更新,它将永远不需要使用订阅者列表,因此它没有理由保留订阅者列表

由于不要求事件必须对传入的委托执行任何操作,因此.NET事件本身除了公开
add
remove
方法之外,不可能提供任何功能

尽管.NET中事件类型的描述符包含一个属性,除了添加和删除外,该属性还可以指定一个raise方法,但该功能在实践中从未使用过。NET的初步设计可能打算使用它,删除类型的任何成员可能会在某些情况下(如反序列化)导致兼容性问题,但除此之外,该属性也可能不存在

An本质上是.NET中的一个结构,它标识了两种方法--
add
方法和
remove
方法;其中每一个都接受一个参数作为参数

虽然事件通常与方法一起使用,这些方法将传入的委托合并到类型为
的字段,或从中删除传入的委托,但这是一个实现细节。虽然创建事件的正常目的是在某些情况下,让他们希望调用的其他代码传入委托,但.NET中的事件机制并不关心传入委托的处理方式

在某些情况下,与事件相关联的
add
remove
方法可以完全合法和合乎逻辑地丢弃传入的委托。例如,不可变的集合类型可能实现
(以便于与控件一起使用,该控件应根据需要自动更新以显示当前集合状态),但放弃传递给更新通知事件的任何委托。如果集合永远不会被更新,它将永远不需要使用订阅者列表,因此它没有理由保留订阅者列表

由于不要求事件必须对传入的委托执行任何操作,因此.NET事件本身除了公开
add
remove
方法之外,不可能提供任何功能


尽管.NET中事件类型的描述符包含一个属性,除了添加和删除外,该属性还可以指定一个raise方法,但该功能在实践中从未使用过。NET的初步设计可能打算使用它,删除类型的任何成员可能会在某些情况下(如反序列化)导致兼容性问题,但除此之外,该属性也可能不存在

感谢您的回复,我实际上在我的应用程序中使用了MEF,我正在尝试从主应用程序触发事件(插件中的人)。有更好的方法吗?@SidAhmed:没有,你不能在包含事件的类之外引发事件(你不需要这样做)。@SidAhmed没有其他方法从外部触发事件。我只是想指出,也许你的设计有一些问题。但是如果没有看到整个画面,很难判断。对于插件系统,我认为我可以让主应用程序触发插件中的事件……好的,谢谢,我已经实现了您的解决方案,它可以工作;-)感谢您的回复,我实际上在应用程序中使用了MEF,我正在尝试触发事件(w