插件架构中的事件与单个应用程序之间的联系

时间:2013-03-20 19:52:59

标签: c# events plugins event-handling

我对我试图针对事件开发的插件架构感到难过。我可以在一个应用程序中做到这一点:(显然这是我想要完成的非常简化的版本,如果这是我的代码,有更简单的方法来实现这一点,只需尝试遵循逻辑;)

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

????

2 个答案:

答案 0 :(得分:0)

您正在尝试将某个事件与另一个事件挂钩,但这不起作用。您需要将插件事件挂钩到方法/委托。完成后,让方法/委托调用另一个事件。

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

答案 1 :(得分:0)

C#中的事件具有以下属性:它们不能直接作为定义它们的类之外的方法(或代理)“可调用”。

在第一个示例中,您将从定义它的类中调用该事件。但是,在第二个示例中,您尝试从类外部调用OnValueOver5Chars - 因此出错。

要解决此问题,您可以考虑向执行IPlugin的{​​{1}}界面(例如ValueOver5Chars)添加方法。请注意,命名事件OnValueOver5Chars(比如说​​)更常见,并提供方法ValueOver5Chars来提升它(即反过来)。例如,请参阅Windows窗体按钮class及其OnValueOver5Chars事件。