2010-12-09 16 views
3

J'ai un besoin particulier que je n'arrive pas à comprendre. J'ai fait des recherches à ce sujet, mais je ne trouve pas de solution réalisable.Obtenir une liste de types génériques appliqués à n'importe quelle classe

j'ai une classe de base:

public abstract class BaseProvider<T> {} 

cette classe à son tour est héritée par deux classes de fournisseur différents:

public sealed class MonkeyProvider<T> 
     : BaseProvider<MonkeyProvider<T>> 
     where T 
     : IAnimalProvider 

Au sein de l'interface IAnimalProvider j'expose une seule propriété que toutes les mises en œuvre doivent dériver. Maintenant, MonkeyProvider et DonkeyProvider peut-être ou quelque chose des besoins similaires à savoir ce que la valeur attribuée à la propriété de l'instance racine est:

public class JoburgZoo 
     : IAnimalProvider 
{ 
    #region IAnimalProvider members 
    public string Id{ get; set; } 
    #endregion 
} 

// somewhere in a console application 
public static void Main(string[] args) 
{ 
    JoburgZoo zoo = new JoburgZoo(); 
    zoo.Id = "Mammals"; 

    **// edit: an instance of the provider will be created** 
    MonkeyProvider<JoburgZoo> mp = new MonkeyProvider<JoburgZoo>(); 
    mp.CheckMonkeys(zoo); // where CheckMonkeys(JoburgZoo) is a method in the provider 
} 

Maintenant, voici ma question réelle:

J'ai la nécessité d'exposer une propriété interne via BaseProvider auquel chaque instance qui l'implémente a accès. Cette propriété doit renvoyer la valeur de "Id" à un moment donné, mais je ne peux pas sembler pouvoir obtenir la valeur par réflexion (ce que je sais être la solution).

De mes divers efforts infructueux:

Type type = typeof(T); // this returns BaseProvider<MonkeyProvider<T>> 
var generic = type.GetGenericTypeDefinition(); // brings back BaseProvider<T> 

Je ne peux pas créer une nouvelle instance de T comme il efface toutes les valeurs actuellement affectées à l'objet. Je ne peux pas itérer la collection d'informations de propriété, car cela ne retournera que les propriétés de BaseProvider.

Merci pour toute aide à ce sujet. Eric

// Éditer. Ajout d'un appel supplémentaire dans le code principal de la console ci-dessus. l'instance de MonkeyProvider<T> modèles JoburgZoo, donc en ProviderBase<T> il ressemblera à quelque chose comme:

ProviderBase<MonkeyProvider<JoburgZoo>> 

Je veux savoir ce que les propriétés de JoburgZoo est, à l'intérieur du BaseProvider<T> sans qu'il soit nécessaire d'identifier l'objet withing MonkeyProvider<T>.

Espérons que cela a du sens.

+0

Quand allez-vous créer votre fournisseur? Peut-être plus de code va effacer les nuages ​​smokey? – TalentTuner

+0

JoburgZoo est un type de fournisseur? – TalentTuner

Répondre

2

Avec définition de classe suivante,

class BaseProvider<T> 
    { 
     //... 
    } 

code suivant retourne System.Int32:

 Type type = typeof(BaseProvider<Int32>); 
     foreach (var arg in type.GetGenericArguments()) 
     { 
      MessageBox.Show(arg.FullName); 
     } 
+0

c'est exactement ce que je cherchais. Je vous remercie – JadedEric