0

私は問題があります; 1つの特定のイベントが独自のカスタムeventargsを持つ外部ライブラリを使用しています。コンストラクターなし。これらのeventargsを使用して自分のイベントをスローしたい場合、どうすればよいですか?

質問があれば詳細を説明しますが、正確に何を提供すべきかわかりません。:)

4

5 に答える 5

6

他の回答は、それを行う方法をいくつか提案しています(またはハックしています)。

ただし、ライブラリの作成者がカスタムEventArgsクラスの新しいインスタンスを作成する方法を提供しなかった場合は、そうするべきではありません。独自のイベントを作成する場合は、(ライブラリですでに定義されているクラスを複製している場合でも)delegate新しいタイプを定義する必要があります。EventArgs

これには正当な理由があります。

  • ライブラリが変更され、ライブラリが提供するカスタムEventArgsタイプがニーズに合わなくなる可能性があります。
  • ライブラリは、特別なオブジェクトまたは特別なIDをライブラリに渡す必要がある場合があるEventArgsため、インスタンスを正しく作成できない場合があります。

イベントは、それが定義されているクラスからのみトリガーできるため、おそらくクラスで(キーワードを使用して)新しいイベントを定義しているeventため、独自のデリゲートを宣言できなかった本当の理由はありません。または、イベントをどのようにトリガーするかについて詳しく教えてください。

于 2010-04-04T01:20:32.043 に答える
1

そのEventArgsクラスから継承する新しいタイプを作成し、それを使用します。ほとんどの場合、既存のEventArgsタイプはabstract、それを継承する新しいタイプを作成できるようにするためのものであり、C#のポリモーフィックサポートにより、基本タイプのインスタンスを期待するすべてのメソッドに新しいタイプを渡すことができます。

于 2010-04-04T00:40:08.220 に答える
1

Reflectorを使用して、外部ライブラリがどのようにインスタンス化するかを確認します。

于 2010-04-04T00:47:56.313 に答える
1

明らかに、ライブラリの設計者はコンストラクターを内部に作成して、あなたがやろうとしていることを正確に実行できないようにしました-良くも悪くも。だからあなたがすることは何でもハックになります。

Reflectionを使用して、クラスのインスタンスを作成できます。を参照してくださいActivator.CreateInstance

さらに大きなハックは、受け取って保存したargsオブジェクトのインスタンスを再利用することかもしれませんが、それは危険です-誰がそれがどのような内部データを含んでいるかを知っています。

于 2010-04-04T00:56:21.750 に答える
0

を使用して、クラスのインスタンスの取得を試みることができますSystem.Runtime.Serialization.FormatterServices。例:

public class Foo
{
    private Foo()
    {
    }
}

..。

Foo foo = (Foo)FormatterServices.GetSafeUninitializedObject(typeof(Foo));
于 2010-04-04T00:54:58.183 に答える