2016-02-29 2 views
1

Compte tenu d'une interface simpleComment instancier un objet d'interface avec l'implémentation transmise à la méthode actuelle en C#?

public interface IIdTracker 
{ 
    int Id { get; } 
} 

et moi avons deux classes qui l'implémente

public class human : IIdTracker 
{ 
    public int Id { return 0; } 
} 

public class robot : IIdTracker 
{ 
    public int Id { return 1; } 
} 

Comment puis-je instancier quelle que soit la classe qui est passé comme IIdTracker sans aucune connaissance de qui ou quoi met en œuvre IIdTracker ?

public void TrackId(IIdTracker idt) 
{ 
    // this is the code I am not sure of 
    var being = new idt.GetType(); 
} 
+0

Avez-vous besoin d'une nouvelle instance d'un 'IIdTracker'? Vous avez * déjà * une instance dans 'idt'. –

+0

Oui, je voulais séparer IIdTracker, mais je voulais le type qui est passé po –

+0

Vous pourriez être en mesure de créer une nouvelle instance avec réflexion (ou via une nouvelle contrainte générique), mais voulez-vous qu'il retourne la même valeur Id? –

Répondre

2

Après quelques recherches, je trouve

var being = Activator.CreateInstance(idt.GetType()) as IIdTracker; 

comme une solution.

2

Une meilleure façon de le faire en utilisant les médicaments génériques seraient:

public void TrackId<T>(T idt) 
     where T:IIdTracker, new() 
    { 
     var being = new T(); 
    } 

et ajoutez un constructeur parameterless public vos classes, par exemple

public class Human : IIdTracker 
{ 
    public Human() { } 
    public int Id { return 0; } 
} 

Par ailleurs, si, comme modifier dit que vous ne pouvez pas le faire parce que, finalement, vous vous retrouvez avec un List de IIdTracker objets que vous essayez de cloner, puis une meilleure approche peut être d'ajouter une méthode .Clone dans votre IIdTracker interface, ou créer une nouvelle interface IIdCloneable afin que les humains ou les robots savent chacun comment créer des clones d'eux-mêmes. Ou, à la place, vous avez un CloneFactory et chaque type s'enregistre lui-même dans l'usine de clones, donc il sait comment créer un de n'importe quoi. L'usine de clones pourrait être aussi simple qu'un Dictionary<Type,Func<IIdTracker>> qui stocke des actions pour créer des humains, des robots ou autres. par exemple. factory.Add(typeof(Human),() => new Human());

+0

Pour que cela fonctionne, le compilateur me dit que mon IIdTracker doit avoir un constructeur sans paramètre. Mais c'est l'interface ... cela fonctionnerait-il uniquement avec la classe abstraite? –

+0

@ publicst119 Les contraintes génériques imposent que 'T' soit à la fois une classe qui implémente' IIdTracker' et un constructeur sans paramètre (c'est la contrainte 'new()' dans la définition de la méthode). Ni votre méthode ne crée une "instance de' IIdTracker' ", ils créent une instance d'une classe qui implémente' IIdTracker'. –

+0

@ publicst119 J'ai ajouté du code par commentaire de Preston montrant ce que vous devez faire. –