with what method done create c# reflection

c# - what - Type.GetType("namespace.abClassName") devuelve null



system.reflection c# (16)

Asegúrese de que la coma esté directamente después del nombre completo

typeof(namespace.a.b.ClassName, AssemblyName)

Como esto no funcionará

typeof(namespace.a.b.ClassName ,AssemblyName)

Me quedé perplejo por unos días en este

Este código:

Type.GetType("namespace.a.b.ClassName")

devuelve null .

y tengo en los usos:

using namespace.a.b;

Actualizar:

El tipo existe, está en una biblioteca de clases diferente, y necesito obtenerlo por nombre de cadena.


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);

Como assemblyName no necesita FullName, solo se requiere el nombre sin Version, Culture y PublicKeyToken.


Cuando solo tengo el nombre de clase, uso esto:

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();


Estoy abriendo controles de usuario según los controles de usuario a los que el usuario tenga acceso especificado en una base de datos. Así que utilicé 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 uno puede usar el valor devuelto en strType para crear una instancia de ese objeto.


Hice trampa. Dado que los tipos que deseo crear (por nombre) están todos en un dll que controlo, simplemente pongo un método estático en el dll en el ensamblado que toma un nombre simple, y las llamadas tipo.GetType de ese contexto y devuelve el resultado .

El propósito original era que el tipo se pudiera especificar por nombre en los datos de configuración. Desde entonces, he cambiado el código para que el usuario haya especificado un formato para procesar. Las clases de manejador de formato implementan una interfaz que determina si el tipo puede analizar el formato especificado. Luego uso la reflexión para encontrar los tipos que implementan la interfaz, y encuentro uno que maneje el formato. Entonces ahora 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 plug-in de tipo pobre.


Intente utilizar el nombre de tipo completo que incluye la información de 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 solo usaba el nombre namespace.classname para obtener el tipo de una clase en un ensamblaje diferente y no funcionaba. 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 trabajó:

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");


Si el ensamblaje forma 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 es un tipo anidado, es posible que te olvides de transformar a. a a +

De todos modos, typeof( T).FullName le dirá lo que debería decir

EDITAR: Por cierto, los usos (como estoy seguro que sabes) son solo directivas para el compilador en tiempo de compilación y no pueden tener ningún impacto en el éxito de la llamada API. (Si tenía 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 ...)


Si se hace referencia al conjunto y la Clase es visible:

typeof(namespace.a.b.ClassName)

GetType devuelve null porque no se encuentra el tipo, con typeof, el compilador puede ayudarlo a encontrar el error.


También puede obtener el tipo sin el nombre calificado del ensamblado, pero también con el nombre dll, 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).


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 ; }


si su clase no está en la asamblea actual debe dar qualifiedName y este código muestra cómo obtener el nombre calificado de la clase

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

y luego puedes obtener el tipo con qualifiedName

Type elementType = Type.GetType(qualifiedName);


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 estas cosas es verdadera, necesitará un nombre calificado para ensamblar .


This solución de arriba 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 conozcas el camino de la asamblea. En mi caso, lo sé porque es un ensamblaje creado 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 de ASP.NET, así que estoy obteniendo una ruta absoluta a través de HttpContext . Sin embargo, la ruta absoluta no es un requisito como parece desde MSDN en AssemblyQualifiedNames


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; }