2009-03-25 5 views
1

Quelqu'un sait comment obtenir un objet Type à partir d'un nom complet?De la chaîne FullyName à l'objet Type

Par exemple.

string fullName = typeof(string).FullName; 
Type stringType = <INSERT CODE HERE> 
Assert.AreEqual(stringType, typeof(string) 
+0

notes sur versioning ajouté, par demande –

+0

Si vous (par commentaire) allez sur le protobuf net et appuyez sur toutes les questions, il suffit de me un -email (voir le profil), ou poser une question sur le SO. –

Répondre

4
string fullName = typeof(string).FullName; 
Type stringType = Type.GetType(fullName); 

Toutefois, notez que ce ne recherche que l'assemblée d'appel et les principaux ensembles MS. Il est préférable d'utiliser soit le AssemblyQualifiedName, de trouver le Assembly en premier, et d'utiliser Assembly.GetType(fullName).

Soit:

string qualifiedName = typeof(string).AssemblyQualifiedName; 
Type stringType = Type.GetType(qualifiedName); 

ou

Assembly a = typeof(SomeOtherTypeInTheSameAssembly).Assembly; 
Type type = a.GetType(fullName); 

Mise à jour sur les commentaires; notez que AssemblyQualifiedName inclut des informations de versionnement; C'est très bien pour des choses comme des fichiers de configuration, mais si (comme c'est le cas ici) vous utilisez ceci pour la persistance, il est souvent préférable d'utiliser un contrat indépendant de l'implémentation. Par exemple, xml (via XmlSerializer ou DataContractSerializer) n'est pas concerné par les types spécifiques, tant que la disposition est correcte.

Si l'espace est un problème, les formats binaires sont souvent plus courts, mais BinaryFormatter inclut les métadonnées de type et n'est pas indépendant de la plate-forme (essayez de le consommer depuis Java, par exemple). Dans ce cas, vous pouvez rechercher des sérialiseurs personnalisés tels que protobuf-net, basé sur des contrats, mais utilisant le format de fil multiplate-forme de «tampons de protocole» de Google.

+0

QualifiedName va avoir des problèmes de version, si je mets à jour mon assembly plus tard, je vais devoir m'inquiéter de le manipuler dans ma couche de persistance ou mes politiques d'éditeur d'expédition –

+0

FWIW Je vous ai donné +1 –

+0

Ensuite, utilisez fullname + Assembly.GetType; Type.GetType échouera généralement à résoudre le type dans les cas les plus intéressants. –

1
string fullName = typeof(string).FullName; 
Type stringType = Type.GetType(fullName); 
Assert.AreEqual(stringType, typeof(string) 
+0

C'était rapide! ;-) – Cerebrus

+0

Cela a même inclus le temps d'ouvrir une nouvelle instance VS et mon récent projet "ConsoleApplication1" pour vérifier ce que j'écrivais était vrai ... – cjk

Questions connexes