面向初学者的 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;
...
}
我是一名初学者 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;
...
}