私はいくつかのクラスを含むクラスライブラリを持っており、各クラスでいくつかのイベントを発生させます。
各イベントには独自のイベント引数のセットがあるため、これらを自動プロパティとしてから継承するクラスに格納しますEventArgs
。次に、継承したクラスInvoke
の新しいインスタンスを呼び出して渡すだけで、関連するイベントを発生させることができます。EventArgs
これは私が意味することです:
using System;
//My Class Library
namespace MyClassLibrary
{
//A class
public class MyClass
{
//My event is a field
public event EventHandler<MyEventHandler> myEvent;
//I raise my event in this method
public void InvokeMyEvent()
{
//Do some stuff
//I raise my event here
myEvent.Invoke(this, new MyEventHandler("The quick brown fox jumps over the lazy dog"));
//Do some more stuff
}
}
//An event handler, containing some interesting data about the event
public class MyEventHandler : EventArgs
{
//Some interesting data as an automatic property
public string MyInterestingData { get; private set; }
//I assign the value of my intersting data in my constructor
public MyEventHandler(string FooBar)
{
MyInterestingData = FooBar;
}
}
}
これが私がやりたいことです。これで、私のアプリケーションで、クラスライブラリへの参照を追加し、MyClass
そのようにイベントをインスタンス化してサブスクライブできます。これ(汎用イベントハンドラーを使用)の優れている点は、Intellisenseを使用すると、イベントをサブスクライブするときにTabキーを使用できるようになり、メソッドを設定して、デフォルトとしてMyEventHandlerを渡すことができることです。キャストは必要ありません。
using System;
using MyClassLibrary;
namespace ConsoleApplication33
{
class Program
{
static void Main(string[] args)
{
MyClass x = new MyClass();
x.myEvent += new EventHandler<MyEventHandler>(x_myEvent);
}
static void x_myEvent(object sender, MyEventHandler e)
{
//Doing lots of important stuff
//Able to access my interesting data in my event handler without casting
var y = e.MyInterestingData;
}
}
}
これはすべて正常にコンパイルされますが、クラスライブラリのポイントは、再利用可能なコードのバンクを確実に持つことです。これは確かにここでの意図です。そこで、クラスライブラリをいくつかのプロジェクトに追加したいと思います。これらのプロジェクトの中には、サブスクライブする必要がmyEvent
あるものもあれば、サブスクライブしないものもありますが、これらのプロジェクトでクラスの他の機能を使用したいのでmyEvent
、将来サブスクライブするオプションがあります。
ただし、サブスクライブしていないプロジェクトでクラスライブラリを使用している場合、がmyEvent
発生するたびにランタイムエラーmyEvent
が発生します。
私は次のように空のメソッドmyEvent
でのコンストラクターにサブスクライブすることでこれを回避しました:MyClass
public MyClass()
{
myEvent += new EventHandler<MyEventHandler>(MyClass_myEvent);
}
void MyClass_myEvent(object sender, MyEventHandler e)
{
}
つまり、クラスライブラリを任意のプロジェクトに追加し、インスタンス化MyClass
して他の機能を使用し、必要に応じてサブスクライブし、そうでない場合はmyEvent
無視することができます。myEvent
これに伴う問題は、MyClassに空のメソッドがあることです。このシナリオを想像してみてください。ただし、約30のイベントがあり、したがって30の空のメソッドがあります。
いくつかの質問
- 私は理にかなっていますか?のように、私がこれについてすべて間違っていると思っていても、少なくとも私がやろうとしていることを理解していますか?
- ここに実際に問題がありますか、それともこれは私が達成しようとしている機能を達成するためのかなり標準的な方法ですか?
ありがとう