Cela dépend de l'ensemble de la classe est.Si elle est en mscorlib
ou en appelant l'ensemble tout ce que vous avez besoin est
Type type = Type.GetType("namespace.class");
Mais si elle est référencée à partir d'une autre assemblée, vous devez faire:
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly;
Type type = assembly.GetType("namespace.class");
//or
Type type = Type.GetType("namespace.class, assembly");
Si vous avez seulement le nom de classe "MyClass", vous devez obtenir le nom de l'espace de nom (ou le nom de l'espace de nom et le nom de l'assembly si c'est un assembly référencé) et le concaténer avec le nom de la classe. Quelque chose comme:
//if class is in same assembly
var namespace = typeof(SomeKnownTypeInNamespace).Namespace;
Type type = Type.GetType(namespace + "." + "MyClass");
//or for cases of referenced classes
var assembly = typeof(SomeKnownTypeInAssembly).Assembly;
var namespace = typeof(SomeKnownTypeInNamespace).Namespace;
Type type = assembly.GetType(namespace + "." + "MyClass");
//or
Type type = Type.GetType(namespace + "." + "MyClass" + ", " + assembly.GetName().Name);
Si vous avez absolument rien (pas preawareness de même le nom d'assembly ou le nom d'espace de noms) mais juste le nom de la classe, alors vous pouvez interroger l'ensemble des ensembles pour sélectionner une chaîne correspondante. Mais cela devrait être beaucoup plus lent:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.FirstOrDefault(x => x.Name == "MyClass");
Notez que cela retourne la première classe correspondant, donc pas besoin d'être très précis si vous auriez plusieurs classes avec le même nom dans les ensembles/namespaces. Dans tous les cas, la mise en cache des valeurs est logique ici. manière un peu plus rapide est de supposer qu'il ya un espace de noms par défaut:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => new { a, a.GetTypes().First().Namespace })
.Select(x => x.a.GetType(x.Namespace + "." + "MyClass"))
.FirstOrDefault(x => x != null);
Mais c'est encore une hypothèse que le type aura le même espace que d'une autre classe au hasard dans l'assemblée; trop fragile, pas très bon.
Si vous voulez des cours d'autres domaines que vous pouvez obtenir une liste de tous les domaines d'application suivants, this link. Vous pouvez faire la même interrogation que montré ci-dessus pour chaque domaine. Si votre assembly où le type réside n'est pas encore chargé, vous devez le charger manuellement en utilisant Assembly.Load
, Assembly.LoadFrom
etc.
duplication possible de [Évitez de donner le nom de l'espace de nom dans Type.GetType()] (http: // stackoverflow .com/questions/9273629/eviter-donner-namespace-nom-dans-type-gettype) – Fr33dan
@ Fr33dan, Boucle circulaire? Le mentionné possible [original] (http://stackoverflow.com/questions/9273629/avoid-giving-namespace-name-in-type-gettype) mentionne [cette question] (http://stackoverflow.com/questions/179102/get-a-system-type-from-types-partial-name) comme original possible (voir [commentaire] (http://stackoverflow.com/questions/9273629/avoid-giving-namespace-name-in-type- gettype # comment39575691_9273629))? :) – publicgk
@publicgk J'étais en train d'essayer de le marquer pour une fusion avec cette question, car ils sont les mêmes mais cette question et les deux ont de bonnes réponses. Voir [cette question meta] (http://meta.stackoverflow.com/q/269080/1111886). Je l'ai fait mal apparemment et abandonné, puis quelqu'un est venu plus tard et a décidé que c'était le doublon puisque l'autre était une question plus ancienne. – Fr33dan