Es un programa simple en el que estoy pasando System.Console y me devolverá los Métodos que tiene usando Reflection... Aquí el objeto Type T toma Null incluso después de que estoy pasando System.Console en txtTypeName.Text
Mi código :
string TypeName = txtTypeName.Text; Type T = Type.GetType(TypeName,true); MethodInfo[] methods = T.GetMethods(); foreach (MethodInfo method in methods) { lstMethod.Items.Add(method.Name); }
Type T = Type.GetType(TypeName);
T
está devolviendo nulo
El comportamiento de Type.GetType()
ha cambiado para .net Core y versiones posteriores*.
Este código funciona con .net 4.8:
Type? t = Type.GetType("System.Console", true); Console.WriteLine(t!.FullName);
¡Pero falla en .net Core y versiones posteriores!
Reproducción que muestra que no funciona en .net 6.0: https://dotnetfiddle.net/JlAhqn
Reproducción que lo muestra funcionando en .net 4.7.2: https://dotnetfiddle.net/ahV7fC
Para que esto funcione en .net Core o posterior, debe especificar el nombre calificado de ensamblado del tipo, que incluye el nombre del ensamblado desde el que se cargó este objeto de tipo.
Para el tipo System.Console
, el nombre del ensamblado también es "System.Console", por lo que lo siguiente funciona en .net Core y .net Framework:
Type? t = Type.GetType("System.Console, System.Console", true); Console.WriteLine(t!.FullName);
Reproducción que lo muestra funcionando en .net 6.0: https://dotnetfiddle.net/dA1ulx
* Como se señaló en la otra respuesta, el comportamiento ha cambiado para "System.Console" porque se movió a otro ensamblaje.
Ha habido algunos otros cambios en el área que pueden afectar a Type.GetType()
, específicamente debido a cambios en Assembly.LoadFrom()
pero esos cambios no causan este efecto.
Vea aquí para más detalles: https://github.com/dotnet/runtime/issues/12376
La respuesta aceptada no es del todo correcta.
El comportamiento de Type.GetType
no cambió entre las versiones del marco. La documentación en ambos estados (en negrita) :
Parámetros
typeName
String
El nombre completo del ensamblado del tipo que se va a obtener. Consulte
AssemblyQualifiedName
. Si el tipo está en el ensamblado que se está ejecutando actualmente o en mscorlib.dll/System.Private.CoreLib.dll , basta con proporcionar el nombre de tipo calificado por su espacio de nombres.
Solo los tipos que están en el ensamblado llamante o en el ensamblado BCL no necesitan calificación. La diferencia entre las dos versiones del marco es simplemente que System.Console
se movió a un ensamblaje diferente, por eso está fallando. Los documentos para .NET 6 muestran System.Console.dll
, mientras que NET 4.7 muestra mscorlib.dll
Puede, por ejemplo, ver en estos dos violines lo que sucede si prueba System.DateTime
sin calificación: funciona en ambos casos.
.NET 4.7
.NET 6