2013-03-20 44 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事件。