2009-05-30 4 views
0

Dans l'exemple suivant, je peux créer un objet dynamiquement via une chaîne; Cependant, je n'ai aucun moyen d'obtenir les méthodes publiques de la classe BASE. Je ne peux pas jeter obj à une BASE parce que je ne sais pas quel générique sera utilisé au moment du design. toute suggestion sur le faire à l'exécution serait bien.C# Création d'objets avec des génériques lors de l'exécution

Un projet contient de catégorie A {T, J>: BASE {T, J>
projet B contient de classe B {T, J>: BASE {T, J>

Project C contient une classe de base { T, J>
contrôle virtuel public {T, J> article

forme Windows Project
événement cmdGo_Click

chaîne dll = TextBox1.Text // ex "ProjectA.dll"
classe string = TextBox2 .text // ex "A`2 [enuT, enuJ]"
objet obj = activator.createinstancefrom (dll, classe)

Répondre

0

A runtime la partie générique de l'équation n'a pas d'importance, car le compilateur a déjà rempli les espaces pour l'implémentation générique. Je crois que vous pouvez utiliser la réflexion pour obtenir les méthodes de classe de base, comme dans cet exemple ci-dessous, j'espère que cela aide.

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods(); 
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"}); 
1

Si vous ne connaissez pas les paramètres de type utilisés au moment de l'exécution, vous ne pouvez pas utiliser toutes les opérations qui dépendent de ces types, donc ... pourquoi ne pas créer une classe de base non générique à BASE qui contient toutes les opérations qui ne dépendent pas des paramètres génériques, alors vous pouvez écrire obj à ce type de base et l'utiliser .

+0

je sais que les paramètres lors de l'exécution comme ils sont énoncés dans la zone de texte A'2 [enuT, enuJ]. Malheureusement, mon contrôle public {T, J> est un must. Je pense que je peux être malchanceux. Merci pour votre aide – alpha

5

Ce code crée une instance de BASE < int, string >:

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string)); 
object instance = Activator.CreateInstance(type); 
+0

problème avec cela est que vous connaissez les génériques au moment du design (typeof (int), typeof (string), je n'ai pas ce luxe. – alpha

Questions connexes