Depende de la que el conjunto de la clase es.Si está en mscorlib
o llamando al montaje de todo lo que necesita es
Type type = Type.GetType("namespace.class");
Pero si se hace referencia desde algún otro montaje, lo que tendría que hacer:
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly;
Type type = assembly.GetType("namespace.class");
//or
Type type = Type.GetType("namespace.class, assembly");
Si sólo tiene el nombre de clase "MyClass", entonces debe obtener de alguna manera el nombre del espacio de nombres (o el nombre del espacio de nombres y el nombre del ensamblado en caso de que se trate de un ensamblaje al que se hace referencia) y concat junto con el nombre de la clase. Algo así como:
//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 usted no tiene absolutamente nada (sin preawareness incluso de nombre de ensamblado o el nombre de espacio de nombres), pero sólo el nombre de la clase, a continuación, se puede consultar la totalidad de las asambleas para seleccionar una cadena coincidente. Pero eso debería ser mucho más lento:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.FirstOrDefault(x => x.Name == "MyClass");
Tenga en cuenta que esto devuelve la primera clase de juego, por lo que no tiene que ser muy preciso si desea tener varias clases con el mismo nombre a través de ensambles/espacios de nombres. En cualquier caso, el almacenamiento en caché de los valores tiene sentido aquí. manera un poco más rápido es asumir que hay un espacio de nombres por defecto:
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);
Pero eso es otra vez una suposición de que el tipo tendrá el mismo espacio de nombres que alguna otra clase al azar en la asamblea; demasiado quebradizo, no muy bueno.
Si desea clases de otros dominios, usted puede obtener una lista de todos los dominios de aplicación, siguiendo this link. A continuación, puede hacer lo mismo de consulta como se muestra arriba para cada dominio. Si su ensamblaje donde reside el tipo no está cargado aún, entonces tiene que cargarlo manualmente usando Assembly.Load
, Assembly.LoadFrom
etc.
posible duplicado de [Evite dar nombre del espacio de nombres en Type.GetType()] (http: // stackoverflow .com/questions/9273629/avoid-giving-namespace-name-in-type-gettype) – Fr33dan
@ Fr33dan, Circular loop? El mencionado posible [original] (http://stackoverflow.com/questions/9273629/avoid-giving-namespace-name-in-type-gettype) menciona [esta pregunta] (http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial-name) como posible original (ver [comentario] (http://stackoverflow.com/questions/9273629/avoid-giving-namespace-name-in-type- gettype # comment39575691_9273629))? :) – publicgk
@publicgk En realidad estaba tratando de marcarlo para una fusión con esa pregunta ya que son los mismos pero esa pregunta y ambas tienen buenas respuestas. Ver [esta meta pregunta] (http://meta.stackoverflow.com/q/269080/1111886). Al parecer lo hice mal y me rendí, luego alguien entró más tarde y decidió que este era el duplicado ya que la otra era una pregunta anterior. – Fr33dan