2

タイプが別のクラスからのインターフェイス(イベントがある場所)を実装しているオブジェクトのイベントを発生させようとすると、問題が発生します。

これが私のコードです:

インターフェイスIBaseForm

public interface IBaseForm
{
    event EventHandler AfterValidation;
}

インターフェイスIBaseFormを実装するフォーム

public partial class ContactForm : IBaseForm
{
    //Code ...

    public event EventHandler AfterValidation;
}

私のコントローラー:ここでエラーが発生します

エラーメッセージ :

イベントAfterValidationは、+ =または-=の左側にのみ表示されます(タイプIBaseFormから使用される場合を除く)

public class MyController
{
    public IBaseForm CurrentForm { get; set; }

    protected void Validation()
    {
        //Code ....

        //Here where the error occurs
        if(CurrentForm.AfterValidation != null)
            CurrentForm.AfterValidation(this, new EventArgs());
    }
}

前もって感謝します

4

2 に答える 2

3

定義クラスの外部からイベントを発生させることはできません。

Raise()インターフェイスにメソッドを作成する必要があります。

public interface IBaseForm
{
    event EventHandler AfterValidation;

    void RaiseAfterValidation();
}

public class ContactForm : IBaseForm
{
    public event EventHandler AfterValidation;

    public void RaiseAfterValidation()
    {
        if (AfterValidation != null)
            AfterValidation(this, new EventArgs());
    }
}

そしてあなたのコントローラーで:

protected void Validation()
{
    CurrentForm.RaiseAfterValidation();
}

ただし、定義クラスの外部からイベントをトリガーする場合は、通常、設計上の問題があります。通常、IBaseForm実装には、イベントをトリガーするロジックが必要です。

于 2012-08-22T14:56:16.677 に答える
1

イベントaddは基本的に、2つのメソッド(メソッドとメソッド)を識別する.NETの構造ですremoveそれぞれがパラメータとしてデリゲートを受け入れます。

イベントは、渡されたデリゲートをタイプのフィールドに結合したり、渡されたデリゲートを削除したりするメソッドでよく使用されますがこれ実装の詳細です。イベントを作成する通常の目的は、特定の状況下で呼び出したい他のコードをデリゲートに渡すことですが、.NETのイベントメカニズムは、渡されたデリゲートでが行われるかを気にしません。MulticastDelegate

場合によっては、イベントに関連付けられaddたメソッドとメソッドが、渡されたデリゲートを単に破棄することが完全に合法かつ論理的である可能性があります。removeたとえば、不変のコレクションタイプを実装する場合がありIObservableCollectionますが(たとえば、現在のコレクションの状態を表示するために必要に応じて自動的に更新されることになっているコントロールでの使用を容易にするため)、update-notificationイベントに渡されたデリゲートを破棄します。コレクションが更新されない場合は、サブスクライバーのリストを使用する必要がないため、リストを保持する理由はありません。

イベントが渡されたデリゲートに対して何かを実行する必要はないため、.NETイベント自体がaddremoveメソッドを公開する以外の機能を提供することはできません。

.NETのイベントタイプの記述子には、追加削除に加えてraiseメソッドを指定できるプロパティが含まれていますが、その機能は実際には使用されません。.NETの予備設計では、.NETを使用することを意図している可能性があり、タイプのメンバーを削除すると逆シリアル化などの一部のコーナーケースで互換性の問題が発生する可能性がありますが、そのような問題以外では、プロパティが存在しない場合もあります。

于 2012-08-22T15:21:02.983 に答える