2011-03-17 7 views
0

Bonjour, J'essaie de découvrir et d'instancier une classe lors de l'exécution. L'assemblage est chargé dans l'objet usine.Instancier une classe à l'exécution par réflexion

Il fonctionne bien jusqu'à ce point

Object obj = Activator.CreateInstance(
    (factory.ProxyAssembly.GetType("tempuri.org.Authorizations"))); 

, mais je ne peux pas obtenir le nom de la propriété avec obj comme Obj.FirstName ou obj.LastName ne sont pas disponibles, donc je suis en train de cataloguée à une classe appropriée sous-jacente.

Mais le code ci-dessous ne fonctionne pas.

factory.ProxyAssembly.GetType("tempuri.org.Authorizations") 
    .UnderlyingSystemType.BaseType a = 
     Activator.CreateInstance(factory.ProxyAssembly 
       .GetType("tempuri.org.Authorizations").UnderlyingSystemType); 

Toute aide est appréciée.

+0

Vous pouvez émettre l'obj aux autorisations? Qu'est-ce que vous essayez exactement de faire, car il pourrait y avoir d'autres meilleures façons d'atteindre votre objectif. – TJHeuvel

+0

Je l'utilise dans la fenêtre Immédiate jusqu'à maintenant. factory.ProxyAssembly.GetType ("tempuri.org.Authorizations"). UnderlyingSystemType.BaseType a = Activateur.CreateInstance (factory.ProxyAssembly.GetType ("tempuri.org.Authorizations"). UnderlyingSystemType); Fin de l'expression attendue Affiche le message "Fin de l'expression attendue" – WorkerThread

+0

@TJHeuvel Je ne connais pas le type Autorisations. Je l'ai trouvé par factory.ProxyAssembly.GetType ("tempuri.org.Authorizations"). UnderlyingSystemType – WorkerThread

Répondre

1

Vous ne pouvez pas diffuser, l'assembly n'est pas ajouté en tant que référence dans votre projet. Vous devez utiliser Reflection pour obtenir les propriétés de l'objet. Utilisez Type.GetProperty et PropertyInfo.GetValue. Notez comment le mot-clé dynamique de C# version 4 peut considérablement réduire la douleur de la syntaxe, recommandé.

+0

Merci Hans Il a travaillé avec p = obj.GetProperty et p.SetValue(). – WorkerThread

1
tempuri.org.Authorizations a = (tempuri.org.Authorizations)Activator.CreateInstance(factory.ProxyAssembly.GetType("tempuri.or g.Authorizations"); 

Regardez dans la coulée avec (type). Où Le type est le type de classe qui revient. Type est une chose de compilation dans ce cas. La réflexion utilise des abstractions pour protéger le type de béton, mais dans ce cas vous en auriez besoin. Sauf si vous utilisez do:

a.getClass().getField("FirstName").getString(a); 
+0

Salut Justin, je reçois ce type tempuri.org.Authorizations de l'Assemblée. Je ne connais pas encore le type, juste le nom. Donc, je ne peux pas utiliser 'tempuri.org.Authorizations a '. C'est pourquoi j'utilise factory.ProxyAssembly.GetType ("tempuri.org.Authorizations") .UnderlyingSystemType.BaseType a sur le côté gauche de l'affectation. – WorkerThread

0

Vous devez diffuser l'objet après l'avoir instancié.

+0

merci les gars. Je ne suis pas encore en mesure de trouver un moyen de typer un type d'exécution dynamique. – WorkerThread

Questions connexes