与单个应用程序相比,在插件体系结构中触发事件



我正在尝试开发与事件相关的插件体系结构。我可以很好地做到这一点,在一个单一的应用程序:(显然,这是我想要完成的一个非常简化的版本,如果这是我的代码,有更简单的方法来完成这一点,只是试着遵循逻辑;)

public Form1()
{
    public event EventHandler OnValueOver5Chars;
    Main()
    {
        OnValueOver5Chars+= new EventHandler(WarnUser);
        ....
    }
    private void textBox_Changed( object sender, EventArgs e )
    {
        if( sender.Text.count() > 5 )
            OnValueOver5Chars(sender, e); // WORKS HERE
    }
    private void WarnUser(object sender, EventArgs e)
    {
        ...
    }
}

但是,现在我有了一个插件架构,其中插件实现了一个容纳我的事件的接口:

// Interface.cs
public interface IPlugin
{
    event EventHandler OnValueOver5Chars;
    ...
}
// Plugin1.cs
public class Plugin1 : IPlugin
{
    public event EventHandler OnValueOver5Chars;
    Plugin1()
    {
        OnValueOver5Chars += new EventHandler(Plugin1WarnUser);
    }
    private void Plugin1WarnUser(object sender, EventArgs e)
    {
        ...
    }
}
// Form.cs
public class Form1 : Form
{
    public Form1()
    {
        Assembly SampleAssembly = Assembly.LoadFrom("Plugin1.dll");
        Type myType = SampleAssembly.GetTypes()[0];
        if (myType.GetInterfaces().Contains(typeof(IPlugin)))
        {
            IPlugin myInstance = Activator.CreateInstance(myType) as IPlugin;
            myInstance.OnValueOver5Chars(this, new EventArgs());
            // Compiler Error CS0079 - The event 'event' can only appear on the left hand side of += or -=
        }
}

? ?

您试图将一个事件连接到另一个事件,但这不起作用。您需要将插件事件挂钩到一个方法/委托。一旦你这样做了,让方法/委托调用另一个事件。

myInstance.OnValueOver5Chars += OnValueOver5CharsFunc;
...
/*In Form1*/
void OnValueOver5CharsFunc( object sender, EventArgs args )
{
    OnValueOver5Chars( sender, args );
}

c#中的事件有一个属性,即它们不能在定义它们的类之外直接作为方法(或委托)被"调用"。

在你的第一个例子中,你从你定义它的类中调用事件。然而,在第二个示例中,您试图从类外部调用OnValueOver5Chars—因此出现错误。

要解决这个问题,您可以考虑在IPlugin接口(例如ValueOver5Chars)中添加一个执行OnValueOver5Chars的方法。请注意,更常见的做法是将事件命名为ValueOver5Chars(例如),并提供一个方法OnValueOver5Chars来引发它(即反过来)。例如,请参阅Windows窗体按钮类及其Click事件。

相关内容

  • 没有找到相关文章

最新更新