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

????

4

2 に答える 2

0

C# のイベントには、定義されているクラスの外部でメソッド (またはデリゲートなど) として直接 "呼び出し可能" ではないというプロパティがあります。

最初の例では、定義したクラス内からイベントを呼び出しています。ただし、2 番目の例では、OnValueOver5Charsクラスの外部から呼び出そうとしているため、エラーが発生します。

これを解決するには、を実行するメソッド (例: ) をIPluginインターフェイスに追加することを検討してください。イベントに名前を付けて(たとえば)、それを発生させるメソッドを提供する方が一般的であることに注意してください (つまり、その逆)。たとえば、Windows フォーム ボタンクラスとそのイベントを参照してください。ValueOver5CharsOnValueOver5CharsValueOver5CharsOnValueOver5CharsClick

于 2013-03-20T21:04:44.047 に答える
0

イベントを別のイベントに接続しようとしていますが、うまくいきません。プラグイン イベントをメソッド/デリゲートにフックする必要があります。それをしたら、メソッド/デリゲートに他のイベントを呼び出させます。

myInstance.OnValueOver5Chars += OnValueOver5CharsFunc;
...
/*In Form1*/
void OnValueOver5CharsFunc( object sender, EventArgs args )
{
    OnValueOver5Chars( sender, args );
}
于 2013-03-20T21:00:13.763 に答える