2010-10-04 5 views
0

Si vous avez:Comment accéder au type attendu par ViewUserControl lors de l'exécution?

System.Web.Mvc.ViewUserControl<T> 

Comment accéder à T lors de l'exécution?

J'ai une classe de base que je passe dans

Html.RenderPartial("ViewName", BaseControlModel); 

mais je veux créer une autre méthode d'extension telle que

Html.RenderTypedPartial("ViewName", BaseControlModel); 

telle que, dans le contexte de ViewName.ascx mon BaseControlModel se transforme dans le type T de la déclaration d'origine. J'ai déjà le code pour transformer BaseControlModel dans le type que je pense, il ressemble à ceci:

BaseControlModel.GetModel<T>(); 

mais je veux invoquer cet intérieur RenderTypedPartial génériquement, au lieu de type T spécifiquement demandé à mon avis. Je suis allé de l'avant et copié collé RenderPartial et FindPartialView dans ma propre méthode d'extension à partir de la source sur CodePlex et le type que je reçois pour ma référence IView est un WebFormView qui n'a pas le type en tant que l'argument générique que je définissais dans mon .ascx partiel ...

Répondre

0
obj.GetType().GetGenericArguments()[0]; 

Le type a lui-même GetGenericArguments pour extraire exactement cela, et vous pouvez faire un type générique aussi par MakeGenericType.

http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx

EDIT: Vous pouvez construire un type comme:

var type = typeof(ViewUserControl<>).MakeGenericType(..); 
return Activator.CreateInstance(type, new object[] { }); //object[] is ctor parms 
+0

qui est la partie facile; la partie la plus difficile est comment obtenez-vous la référence à obj représentant le ViewUserControl? – gazarsgo

+0

Publiera la réponse ci-dessus. –

+0

Je n'ai pas besoin d'un type ouvert de ViewUserControl, j'ai besoin du type fermé défini par mon .ascx. J'ai creusé un peu plus et il semble que je pourrais ne pas avoir de chance jusqu'à la prochaine version de MVC car elle est encore étroitement couplée au moteur de rendu webforms - BuildManager convertit ViewUserControl en WebFormView donc je perds probablement ma référence de type sauf Je crée mon propre BuildManager ... – gazarsgo

Questions connexes