2013-03-20 40 views
0

我正在试图利用我正在尝试开发的事件方面的插件体系结构。我可以在单个应用程序中做到这一点:(显然,这是我试图完成的一个非常简化的版本,如果这是我的代码,有更简单的方法来完成此操作,只需遵循逻辑;)在插件体系结构中激发事件与单个应用程序

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

????

回答

0

您正在尝试将事件连接到另一个事件,而这不起作用。您需要将插件事件挂接到方法/委托。一旦你这样做,让方法/委托调用其他事件。

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

C#中的事件具有这样的性质,它们不能直接作为定义类之外的方法(或代理)“调用”。

在第一个示例中,您将从您定义它的类中调用该事件。然而,在第二个例子中,您正尝试从课堂外拨打OnValueOver5Chars - 因此出现错误。

为了解决这个问题,您可以考虑在您的IPlugin接口(例如ValueOver5Chars)中添加一个方法,该方法执行OnValueOver5Chars。请注意,将事件ValueOver5Chars(比如说)命名并提供一种方法OnValueOver5Chars以提高事件(即相反方向)更为常见。请参阅Windows窗体按钮class及其Click事件。