C#为初学者提供代理和活动

时间:2015-02-25 06:53:49

标签: c# events plugins reflection

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

我目前拥有的内容:我有一个基础架构,用于提供GUI,函数和类,并且其他插件可以访问GUI,函数和类的每个实例。 (例如,如果一个插件(插件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文章,但没有一篇试图将一个插件订阅到另一个。

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

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

  

'System.EventHandler'类型的对象无法转换为'Test_Plugin_for_Server.Events + tester'类型

请有人帮帮我吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

你的问题有点模糊,似乎你想要那样的东西

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; 
  ... 
}