2011-01-22 5 views
4

J'essaie de créer un constructeur de copie pour mon objet C# en utilisant la réflexion. Je suis capable de copier tous les champs et propriétés (ceux-ci sont faciles) mais j'ai quelques problèmes en copiant les événements.C# Constructeur de copie personnalisée, copie d'événements

Existe-t-il un moyen de (par réflexion) copier tous les délégués qui se sont abonnés à un événement d'un objet à un autre? (Les deux seront du même type)

Merci :)

+2

C# n'était pas conçu pour avoir des constructeurs de copie; avez-vous essayé 'ICloneable.Clone()' et 'Object.MemberwiseClone()'? – Mehrdad

+0

Je pensais à implémenter ces interfaces, mais je voulais un constructeur très générique, parce que je l'implémente sur une classe héritée par plusieurs autres classes. Quant à Copy Constructor, ce n'est pas comme le cctor C++, c'est juste un constructeur qui prend un objet avec le même type de base et le clone. La raison pour laquelle je fais cela est parce que la classe doit également être éliminée, donc si j'ai besoin d'un objet qui persiste, au lieu de refaire tout le temps de disposition, faire une copie de l'objet semble plus facile :) –

Répondre

2

Il dépendra entièrement de la mise en œuvre. Après tout, un événement peut être mis en œuvre comme vous le souhaitez. Si vous utilisez un événement comme champ alors vous devriez être en mesure de copier juste la valeur du champ:

using System; 

class Test 
{ 
    public event EventHandler SomeEvent; 

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

Cela est bien que les délégués sont immuables - souscrivant à un événement crée un nouveau délégué et assigne cette sur le terrain, de sorte que vos deux objets seraient indépendants. Si l'événement a été implémenté en utilisant quelque chose comme EventHandlerList, vous voudriez créer un clone plutôt que d'utiliser une simple affectation de champ.

EDIT: Pour faire cela avec réflexion, vous utiliseriez simplement les champs comme les autres. Les événements de type champ sont simplement des événements soutenus par des champs. Si vous copiez déjà tous les champs d'une classe, vous n'aurez aucun travail supplémentaire à faire.

Sachez que si vous allez à un effort supplémentaire, vous ne faites une peu profonde copie - si vous avez un champ de type List<string>, par exemple, votre nouvel objet fera référence au même objet que l'ancien objet , donc tout changement à la liste sera vu via les deux objets.

+0

, tous les événements sont comme sur le terrain. Mais comment puis-je le faire par réflexion? –

+0

@joe_coolish: Désolé, j'ai manqué ce bit - va éditer. –

+0

Doux! Merci :) J'ai l'objet original, le nouvel objet, et l'EventInfo pour l'événement. Je n'ai juste pas eu l'événement à ajouter de l'original au nouveau. –

Questions connexes