2009-09-23 7 views
1

Je reçois un Type en utilisant Assembly classe comme suit:Comment créer un objet générique à partir d'un type chargé dynamiquement?

var asm = Assembly.GetAssembly(typeof(MyAssembly)); 
var t=asm.GetType("FULLY QUALIFIED CLASS NAME", true, true); 

Ensuite, je créer un objet de ce type:

var obj = Activator.CreateObject(t, new []{ params }); 

Maintenant, je veux convertir ou jeter cet objet à un objet Generic (en fait SubSonic Active Record Object).

var record = (ActiveRecord<PUT SOMEHOW TYPE t HERE>)obj; 

Comment puis-je accomplir cela?

+0

Pouvez-vous pas seulement faire le nom complet de la classe soit la ActiveRecord , au lieu de seulement la partie ? –

+1

Je ne pense pas que ce soit possible. Casting dit au compilateur que vous (le développeur) * savez * quel sera le type, mais vous ne le savez pas ici. –

Répondre

3

Le point de statique frappe est que vous connaissez le type à la compilation.

À votre avis, quel est le type de la variable record? Le compilateur doit savoir - il ne peut pas attendre le temps d'exécution. Que voulez-vous faire avec record de toute façon? Si le but réel est de créer un objet ActiveRecord<T> mais que vous n'avez pas besoin de connaître le T pour d'autres opérations, vous devrez utiliser la réflexion avec Type.MakeGenericType ou MethodInfo.MakeGenericMethod en fonction de l'API ActiveRecord (que je ne connais pas) ... mais vous ne pourrez pas utiliser le résultat de manière statique (cela dépend de T) dans les lignes de code qui suivent.

Est-ce que ActiveRecord<T> met en œuvre une interface non générique? Si c'est le cas, c'est ce que vous utiliseriez habituellement après la construction de l'instance pertinente.

Si vous pouvez fournir un lien vers la documentation ActiveRecord<T> pour montrer comment construire une instance, je suis heureux d'écrire le code de réflexion pour vous ...

0

votre classe doit hériter de ActiveRecord ou être elle-même ActiveRecord.

vous essayez de jeter un type dans un autre objet receving l'ancienne administration comme varible:

Cat c = new Cat(); 
List<Cat> l = (List<Cat>) c; // error. 
Questions connexes