这是一个简单的程序,我在其中传递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
的行为在框架版本之间没有变化。它们中的文档都声明(我的粗体(:
参数
typeName
String
要获取的类型的程序集限定名。参见
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