给定部分限定类型名称时,Type.GetType如何工作?

mar*_*ark 21 .net types

在很多地方,我遇到了表单的部分限定类型名称FullTypeName, AssemblyName,即Type.AssemblyQualifiedName只有没有版本,culture和publicKeyToken限定符.

我的问题是如何Type以最小的努力将其转换为相应的?我认为这样Type.GetType做,但唉,事实并非如此.例如,以下代码返回null:

Type.GetType("System.Net.Sockets.SocketException, System");
Run Code Online (Sandbox Code Playgroud)

当然,如果我指定完全限定名称,它确实有效:

Type.GetType("System.Net.Sockets.SocketException, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
Run Code Online (Sandbox Code Playgroud)

非常感谢.

dmi*_*scu 31

如果程序集已加载到当前域中,则下面的代码通常有效:

public static Type GetTypeEx(string fullTypeName)
{
    return Type.GetType(fullTypeName) ??
           AppDomain.CurrentDomain.GetAssemblies()
                    .Select(a => a.GetType(fullTypeName))
                    .FirstOrDefault(t => t != null);
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它:

Type t = GetTypeEx("System.Net.Sockets.SocketException");
Run Code Online (Sandbox Code Playgroud)


Nic*_*ver 8

如果它所在的DLL尚未加载到应用程序域中(例如,您使用它),则需要这样的完整路径,如果它已经加载,则可以使用较短的版本找到它.

回答你的问题:第二个版本总是有效,坚持下去,你有一种方法可以担心.