一个插件架构VS单一的应用程序触发事件(Firing events within a plug-in

2019-11-01 20:18发布

我越来越难住了我的插件架构,我想对于事件的发展。 我能做到这一点就好了,在一个单一的应用程序:(显然这是什么,我试图完成一个非常简化的版本,如果这是我的代码有更简单的方法来做到这一点,只是尽量遵循逻辑;)

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 -=
        }
}

????

Answer 1:

你试图挂钩事件到另一个事件,这是行不通的。 你需要插件事件挂钩的方法/委托。 一旦你这样做,有方法/委托调用其他事件。

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


Answer 2:

在C#事件具有它们不是(如代表或作为)在那里它们被定义的类之外的“调用”直接作为方法的性质。

在你的第一个例子中,你在呼唤从你定义它的类中的事件。 在第二个例子,但是,你正在试图调用OnValueOver5Chars从类的外部-因此错误。

为了解决这个问题,你可以考虑增加一个方法,你IPlugin接口(例如ValueOver5Chars执行) OnValueOver5Chars 。 请注意,这是比较常见的命名事件ValueOver5Chars (说),并提供一个方法OnValueOver5Chars提高它(即其他全面)。 见例如Windows窗体按钮类和它的Click事件。



文章来源: Firing events within a plug-in architecture vs single application