私は問題があります; 1つの特定のイベントが独自のカスタムeventargsを持つ外部ライブラリを使用しています。コンストラクターなし。これらのeventargsを使用して自分のイベントをスローしたい場合、どうすればよいですか?
質問があれば詳細を説明しますが、正確に何を提供すべきかわかりません。:)
他の回答は、それを行う方法をいくつか提案しています(またはハックしています)。
ただし、ライブラリの作成者がカスタムEventArgs
クラスの新しいインスタンスを作成する方法を提供しなかった場合は、そうするべきではありません。独自のイベントを作成する場合は、(ライブラリですでに定義されているクラスを複製している場合でも)delegate
新しいタイプを定義する必要があります。EventArgs
これには正当な理由があります。
EventArgs
タイプがニーズに合わなくなる可能性があります。EventArgs
ため、インスタンスを正しく作成できない場合があります。イベントは、それが定義されているクラスからのみトリガーできるため、おそらくクラスで(キーワードを使用して)新しいイベントを定義しているevent
ため、独自のデリゲートを宣言できなかった本当の理由はありません。または、イベントをどのようにトリガーするかについて詳しく教えてください。
そのEventArgsクラスから継承する新しいタイプを作成し、それを使用します。ほとんどの場合、既存のEventArgsタイプはabstract
、それを継承する新しいタイプを作成できるようにするためのものであり、C#のポリモーフィックサポートにより、基本タイプのインスタンスを期待するすべてのメソッドに新しいタイプを渡すことができます。
Reflectorを使用して、外部ライブラリがどのようにインスタンス化するかを確認します。
明らかに、ライブラリの設計者はコンストラクターを内部に作成して、あなたがやろうとしていることを正確に実行できないようにしました-良くも悪くも。だからあなたがすることは何でもハックになります。
Reflectionを使用して、クラスのインスタンスを作成できます。を参照してくださいActivator.CreateInstance
。
さらに大きなハックは、受け取って保存したargsオブジェクトのインスタンスを再利用することかもしれませんが、それは危険です-誰がそれがどのような内部データを含んでいるかを知っています。
を使用して、クラスのインスタンスの取得を試みることができますSystem.Runtime.Serialization.FormatterServices
。例:
public class Foo
{
private Foo()
{
}
}
..。
Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));