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.
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.
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 :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
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 tiempo
También puede obtener el tipo sin nombre calificado de ensamblado pero con el nombre dll también, por ejemplo:
Type myClassType = Type.GetType("TypeName,DllName");
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:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
La segunda cadena después de la coma es el nombre de referencia (nombre dll).
NamespaceTypeName, AssemblyNameSpec
donde AssemblyNameSpec
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 ejemplo Version
, Culture
PublicKeyToken
). Afortunadamente, las propiedades son opcionales .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
intenta usar este método
public static Type GetType(string typeName)
{
var type = Type.GetType(typeName);
if (type != null) return type;
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
type = a.GetType(typeName);
if (type != null)
return type;
}
return null ;
}
AppDomain
no es compatible. No estoy seguro de ninguna alternativa.
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
lock (typeCache) {
if (!typeCache.TryGetValue(typeName, out t)) {
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
t = a.GetType(typeName);
if (t != null)
break;
}
typeCache[typeName] = t; // perhaps null
}
}
return t != null;
}
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:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
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
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
y luego puede obtener el tipo con qualifiedName
Type elementType = Type.GetType(qualifiedName);
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 decir
EDITAR: 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 ...)
+
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 ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Entonces, ahora se puede usar el valor devuelto en strType para crear una instancia de ese objeto.
Como Type.GetType (String) necesita el Type.AssemblyQualifiedName , debe usar Assembly.CreateQualifiedName (String, String) .
string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);
La Versión, Cultura y PublicKeyToken no son necesarias, por assemblyName
eso puede usar MyAssembly.GetName (). Name.
Acerca de Type.GetType (String) :
Si el tipo está en el ensamblaje que se está ejecutando actualmente o en Mscorlib.dll, es suficiente proporcionar el nombre de tipo calificado por su espacio de nombres.
Si se hace referencia al ensamblaje y la clase es visible:
typeof(namespace.a.b.ClassName)
GetType devuelve nulo porque no se encuentra el tipo, con typeof, el compilador puede ayudarlo a descubrir el error.
Intente usar el nombre de tipo completo que incluye la información del ensamblaje, por ejemplo:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
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.
¡Para mí, un "+" fue la clave! Esta es mi clase (es anidada):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
y esta línea de código funcionó:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Esta solución anterior parece ser la mejor para mí, pero no funcionó para mí, así que lo hice de la siguiente manera:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
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 AssemblyQualifiedNames
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.