Type T = Type.GetType(TypeName); T is returning Null



这是一个简单的程序,我在其中传递System.Console,它将使用反射返回它所拥有的方法。。。此处Type对象T为Null,即使在我通过txtTypeName.Text 中的System.Console之后也是如此

我的代码:

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返回空

接受的答案不太正确

Type.GetType的行为在框架版本之间没有变化。它们中的文档都声明(我的粗体(:

参数

typeNameString

要获取的类型的程序集限定名。参见AssemblyQualifiedName。如果该类型在当前执行的程序集中或mscorlib.dll/System.Private.CoreLib.dll中,则提供由其命名空间限定的类型名称就足够了。

只有在调用程序集中或BCL程序集中的类型才不需要鉴定。两个版本的框架之间的区别只是System.Console被移到了不同的程序集,所以这就是它失败的原因。NET 6的文档显示System.Console.dll,而NET 4.7显示mscorlib.dll

例如,您可以在这两个技巧中看到,如果您在没有限定的情况下尝试System.DateTime会发生什么:它在这两种情况下都有效
.NET 4.7
.NET 6

对于.net Core和更高版本*,Type.GetType()的行为发生了变化。

此代码适用于.net 4.8:

Type? t = Type.GetType("System.Console", true);
Console.WriteLine(t!.FullName);

但它在.net Core和更高版本中失败了!

Repro显示它在.net 6.0中不起作用:https://dotnetfiddle.net/JlAhqn

重新显示它在.net 4.7.2中工作:https://dotnetfiddle.net/ahV7fC

若要在.net Core或更高版本中执行此操作,您需要指定类型的程序集限定名称,其中包括从中加载此type对象的程序集的名称。

对于类型CCD_ 12,程序集名称也是";System控制台";因此以下内容在.net Core.net Framework中有效:

Type? t = Type.GetType("System.Console, System.Console", true);
Console.WriteLine(t!.FullName);

Repro显示它在.net 6.0中工作:https://dotnetfiddle.net/dA1ulx


*如另一个答案所指出的;System控制台";因为它已移动到另一个程序集。

该区域还有一些其他变化可能会影响Type.GetType(),特别是因为Assembly.LoadFrom()的变化,但这些变化并没有造成这种影响。

有关详细信息,请参见此处:https://github.com/dotnet/runtime/issues/12376

相关内容

最新更新