面向初学者的 C# 委托和事件

C# Delegate and Events for Beginners

我是一名初学者 C# 程序员,刚刚踏入高级插件世界。

我目前所拥有的:我有一个插件的基本架构,可以提供 GUI、功能和 classes 以及 GUI、功能和class 可以被其他插件访问。 (例如,如果一个插件(插件 a)的状态因为用户更改而改变,那么它可以将插件 b 中标签中的文本更改为新用户名)。

我正在努力工作: 一言以蔽之。事件。如果插件 a 有一个事件,我希望插件 b 能够订阅它。我正在使用通用事件处理程序委托,但它不想订阅。

我已经看过的资源: http://www.dreamincode.net/forums/topic/78974-using-reflection-to-load-unreferenced-assemblies-at-runtime/ - 非常有用

c# Plugin Event Handling

Firing events within a plug-in architecture vs single application

问题是大多数人都试图从应用程序订阅插件中的事件。 我希望将一个插件订阅到第二个插件的事件

我目前的代码:

插件 1 事件:

 public class Events
{

    public event tester testingevt;
    public delegate void tester(object o, EventArgs e);

    public void fireIt()
    {
        if (testingevt != null)
        {
            testingevt(this, null);
        }
    }
}

插件 2(订阅):

public void onLoad()
    {
        object tempInstance = pf.getInstance("thisisaplugin", "Events");
        Type t = tempInstance.GetType();
        t.GetEvent("testingevt").AddEventHandler(tempInstance, new EventHandler(tester));
    }

我也看过各种 MSDN 文章,但其中 none 试图将一个插件订阅到另一个插件。

我使用的代码直接来自 dreamincode.net link.

我通过创建委托类型尝试了许多不同的方法,使用 eventinfo 变量来存储事件,这是我最接近收集事件的方法,但此代码抛出的错误是:

Object of type 'System.EventHandler' cannot be converted to type 'Test_Plugin_for_Server.Events+tester'

请问有人能帮帮我吗?

提前致谢。

你的问题有点含糊,看来你想要的是这样的

public class Events {
  // Usually, you don't have to declare delegate:
  // there's a special class for it - EventHandler or EventHandler<T>
  public event EventHandler TestingEvt; // <- let's make it readable

  public void fireIt() {
    if (TestingEvt != null) {
      // Passing null is a bad practice, give EventArgs.Empty instead 
      TestingEvt(this, EventArgs.Empty);
    }
  }
  ...
}

...

private void tester(Object sender, EventArgs e) {
  // Events that fired the event - if you need it
  Events caller = sender as Events;
  ...
}

...

public void onLoad() {
  // Get the instance
  Events tempInstance = pf.getInstance("thisisaplugin", "Events") as Events;
  // Or just create an isntance
  // Events tempInstance = new Events();
  ...

  // Assigning (adding) the event
  tempInstance.TestingEvt += tester; 
  ... 
}