2011-01-22 1 views
4

リフレクションを使用してC#オブジェクトのコピーコンストラクタを作成しようとしています。私はすべてのフィールドとプロパティ(簡単です)をコピーすることができますが、私はイベントをコピーするいくつかの問題があります。カスタムコピーコンストラクタ、コピーイベント

あるオブジェクトから別のオブジェクトにイベントをサブスクライブしたすべてのデリゲートを(リフレクションによって)コピーする方法はありますか? (両方が同じタイプになります)

いただきありがとうございます:)

+2

C#はコピーコンストラクタを持つようには設計されていませんでした。 'ICloneable.Clone()'と 'Object.MemberwiseClone()'を試してみましたか? – Mehrdad

+0

私はこれらのインターフェイスを実装しようと考えていましたが、私は非常に一般的なコンストラクタが必要でした。これは、他のいくつかのクラスに継承されるクラスでこれを実装しているためです。コピーコンストラクタに関しては、これはC++のcctorのようなものではありません。それは、同じ基本型を持つオブジェクトを取得してそれを複製する単なるコンストラクタです。私はこれをやっている理由は、クラスも処分する必要があるからです。そのため、オブジェクトのコピーを作るのがより簡単に見えるように、ディスペンスのタイミングをやり直すのではなく、アイテムが必要な場合は –

答えて

2

をそれは完全な実装に依存します。結局のところ、あなたが望む方法でイベントを実装することができます。あなたはフィールドのようなイベントを使用している場合は、あなただけのフィールド値をコピーすることができるはずです。

using System; 

class Test 
{ 
    public event EventHandler SomeEvent; 

    public Test(Test other) 
    { 
     this.SomeEvent = other.SomeEvent; 
    } 
} 

デリゲートは不変であるので、これは素晴らしいです - イベントをサブスクライブすると、新しいデリゲートを作成していることを割り当てあなたの2つのオブジェクトは独立しています。 EventHandlerListのようなイベントを使用してイベントを実装した場合は、簡単なフィールド割り当てを使用するのではなく、クローンを作成することをお勧めします。

編集:これを反映させるには、他のフィールドと同じようにフィールドを使用します。フィールドのようなイベントは、単にフィールドに裏打ちされたイベントです。すでにクラス内のすべてのフィールドをコピーしている場合は、余分な作業は必要ありません。

あなたは余分な労力に行く場合を除き、あなただけ浅いコピーを作ってあげることに注意してください - あなたがタイプList<string>のフィールドを持っている場合たとえば、あなたの新しいオブジェクトが古いオブジェクトと同じオブジェクトを参照しますしたがって、リストへの変更は両方のオブジェクトを介して表示されます。

+0

はいすべてのイベントはフィールドのようです。しかし、私はどのように反映させることでこれを行うのですか? –

+0

@joe_coolish:申し訳ありませんが、私はそのビットを逃しました - 編集します。 –

+0

甘い!ありがとう:)元のオブジェクト、新しいオブジェクト、イベントのEventInfoがあります。私はちょうどそのイベントを元のものから新しいものに加えることを得ていない。 –