2009-12-15 3 views
1

I donne les résultats suivants: coursComment puis-je créer une méthode d'usine Clone générique en C#?

public abstract class Item 
{ 
    //... 
} 

public class Customer : Item 
{ 
    //... 
} 

public class Address : Item 
{  
    //... 
} 

Je veux être en mesure de créer des clones exactes utilisant une classe réflexion personnalisée comme ceci:

Customer customer = new Customer(); 
ItemReflector irCustomer = new ItemReflector(customer); 
Customer customerClone = irCustomer.GetClone<Customer>(); 

Mais je vais avoir problème avec la syntaxe de la méthode GetClone: ​​

public class ItemReflector 
{ 
    private Item item; 

    public ItemReflector(Item item) 
    { 
     this.item = item; 
    } 

    public Item GetClone<T>() 
    { 
     T clonedItem = new T(); 
     //...manipulate the clonedItem with reflection... 
     return clonedItem; 
    } 
} 

Que dois-je changer la méthode GetClone() ci-dessus pour que cela fonctionne?

+0

Regardez ma réponse sur [Pourquoi pas ICloneable ?] (Http://stackoverflow.com/questions/536349/why-no-icloneablet) – TcKs

Répondre

6

Vous avez besoin d'une contrainte new si vous voulez être en mesure d'instancier T:

public Item GetClone<T>() where T: new() 
{ 
    T clonedItem = new T(); 
    //...manipulate the clonedItem with reflection... 
    return clonedItem; 
} 
+0

parfait, merci. –

0

Depuis GetClone() est de retour Item on peut supposer que la contrainte est que T est une sous-classe de Item.

Aussi depuis ItemReflector ne semble pas avoir besoin d'état devrait être static.

Questions connexes