Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件必须是委托类型?_C# - Fatal编程技术网

C# 事件必须是委托类型?

C# 事件必须是委托类型?,c#,C#,不太熟悉声明和使用事件以及接收到的错误 事件必须是委托类型 基本上希望将IMyInterface作为依赖项传递给另一个类,该类可以订阅接收MyClassEvent事件,事件数据为MyClass public interface IMyInterface { event MyClass MyClassEvent; } public class Implementation: IMyInterface { event MyClass MyClassEvent; publi

不太熟悉声明和使用事件以及接收到的错误

事件必须是委托类型

基本上希望将
IMyInterface
作为依赖项传递给另一个类,该类可以订阅接收
MyClassEvent
事件,事件数据为
MyClass

public interface IMyInterface
{
   event MyClass MyClassEvent;
}

public class Implementation: IMyInterface
{
     event MyClass MyClassEvent;
     public void OnSomethingHappened
     {
         MyClassEvent?.Invoke(); // pass MyClass to subscribers
     }
}

public class AnotherClass(IMyInterface ...)
{
    OnMyClassEvent(MyClass args)
    {
       // do something
    }
}

您需要正确声明事件并定义事件参数:

public class MyClassEventArgs : EventArgs { }

public interface IMyInterface
{
    event EventHandler<MyClassEventArgs> MyClassEvent;
}

public class Implementation : IMyInterface
{
    public event EventHandler<MyClassEventArgs> MyClassEvent;

    public void OnSomethingHappened()
    {
        MyClassEvent?.Invoke(this, new MyClassEventArgs());
    }
}

您没有向我们显示
MyClassEvent
,您对另一个类的
声明似乎有参数,不知何故。。。但是,是的,事件类型必须是代理。大概
MyClass
不是委托类型。也许您想要
EventHandler
?似乎您并不真正了解事件是如何工作的,请参阅EventHandler上的委托和事件示例是否是执行此操作的新方法?我见过很多使用委托的例子?
EventHandler
出现在.NET2中,在这之前,您必须声明自己的委托
var implementation = new Implementation();
implementation.MyClassEvent += MyClassEvent;

private void MyClassEvent(object sender, MyClassEventArgs e) { ... }