Este código:
Type.GetType("namespace.a.b.ClassName")
vuelve null
.
y tengo en los usos:
using namespace.a.b;
Actualizar:
El tipo existe, está en una biblioteca de clase diferente y necesito obtenerlo por nombre de cadena.
c#
reflection
Omu
fuente
fuente
Respuestas:
Type.GetType("namespace.qualified.TypeName")
solo funciona cuando el tipo se encuentra en mscorlib.dll o en el ensamblado que se está ejecutando actualmente.Si ninguna de esas cosas es cierta, necesitará un nombre calificado como ensamblado :
fuente
Assembly a = Assembly.Load("SomeLibrary");
- y luego cargar el tipo por nombre desde el ensamblaje -Type t = a.GetType("namespace.a.b.ClassName");
.typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
puede ahorrar algo de molestia, con el tiempoTambién puede obtener el tipo sin nombre calificado de ensamblado pero con el nombre dll también, por ejemplo:
Tuve la misma situación y funcionó para mí. Necesitaba un objeto de tipo "DataModel.QueueObject" y tenía una referencia a "DataModel", así que obtuve el tipo de la siguiente manera:
La segunda cadena después de la coma es el nombre de referencia (nombre dll).
fuente
NamespaceTypeName, AssemblyNameSpec
dondeAssemblyNameSpec
está el identificador del ensamblaje sin ninguna propiedad. Aunque esta respuesta es esencialmente la misma que la aceptada, supongo que algunas personas prefieren esto porque elimina parte del "ruido" que introducen las propiedades del ensamblaje (por ejemploVersion
,Culture
PublicKeyToken
). Afortunadamente, las propiedades son opcionales .AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
intenta usar este método
fuente
AppDomain
no es compatible. No estoy seguro de ninguna alternativa.fuente
T
del tipo genérico se elimina.Si el ensamblaje es parte de la compilación de una aplicación ASP.NET, puede usar la clase BuildManager:
fuente
Si su clase no se encuentra en el asalto actual, debe dar nombre calificado y este código muestra cómo obtener el nombre calificado de la clase
y luego puede obtener el tipo con qualifiedName
fuente
Si es un tipo anidado, es posible que se olvide de transformar a. a un +
De todos modos,
typeof( T).FullName
te diré lo que deberías decirEDITAR: Por cierto, los usos (como estoy seguro de que sabe) son solo directivas para el compilador en el momento de la compilación y, por lo tanto, no pueden tener ningún impacto en el éxito de la llamada API. (Si tuviera referencias de proyectos o ensamblajes, eso podría haber tenido influencia; por lo tanto, la información no es inútil, solo requiere un poco de filtrado ...)
fuente
+
separador)Estoy abriendo controles de usuario dependiendo de a qué controles de usuario tenga acceso el usuario especificado en una base de datos. Así que usé este método para obtener el TypeName ...
Entonces, ahora se puede usar el valor devuelto en strType para crear una instancia de ese objeto.
fuente
Cuando solo tengo el nombre de la clase, uso esto:
fuente
Como Type.GetType (String) necesita el Type.AssemblyQualifiedName , debe usar Assembly.CreateQualifiedName (String, String) .
La Versión, Cultura y PublicKeyToken no son necesarias, por
assemblyName
eso puede usar MyAssembly.GetName (). Name.Acerca de Type.GetType (String) :
fuente
Si se hace referencia al ensamblaje y la clase es visible:
GetType devuelve nulo porque no se encuentra el tipo, con typeof, el compilador puede ayudarlo a descubrir el error.
fuente
Intente usar el nombre de tipo completo que incluye la información del ensamblaje, por ejemplo:
Tuve la misma situación cuando estaba usando solo el namesspace.classname para obtener el tipo de una clase en un ensamblado diferente y no funcionaría. Solo funcionó cuando incluí la información de ensamblaje en mi cadena de tipo como se muestra arriba.
fuente
Asegúrese de que la coma va directamente después del nombre completo
Como esto no funcionará
Estuve perplejo por unos días en este
fuente
¡Para mí, un "+" fue la clave! Esta es mi clase (es anidada):
y esta línea de código funcionó:
fuente
Esta solución anterior parece ser la mejor para mí, pero no funcionó para mí, así que lo hice de la siguiente manera:
La condición previa es que conozca el camino de la asamblea. En mi caso, lo sé porque este es un ensamblaje construido a partir de otro proyecto interno y está incluido en la carpeta bin de nuestro proyecto.
En caso de que sea importante, estoy usando Visual Studio 2013, mi objetivo .NET es 4.0. Este es un proyecto ASP.NET, por lo que obtengo una ruta absoluta a través de
HttpContext
. Sin embargo, la ruta absoluta no es un requisito como parece de MSDN en AssemblyQualifiedNamesfuente
Hice trampa. Dado que los tipos que quiero crear (por nombre) están todos en un dll que controlo, solo pongo un método estático en el dll en el ensamblado que toma un nombre simple y llama a type.GetType desde ese contexto y devuelve el resultado .
El propósito original era que el tipo pudiera especificarse por nombre en los datos de configuración. Desde entonces he cambiado el código para que el usuario especifique un formato para procesar. Las clases de controlador de formato implementan una interfaz que determina si el tipo puede analizar el formato especificado. Luego uso la reflexión para buscar tipos que implementen la interfaz y encontrar uno que maneje el formato. Entonces, la configuración especifica un nombre de formato, un tipo no específico. El código de reflexión puede mirar dlls adyacentes y cargarlos, así que tengo una arquitectura de plug-in de tipo pobre.
fuente