按名称获取类型

时间:2013-11-15 18:55:31

标签: c# visual-studio-2012 .net-4.5

在我的代码中,我试图按名称获取类型。当我使用字符串参数时,我失败了。然后我试着在快速观察窗口中进行以下操作:

Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).Name)

返回null。为什么?以及如何按名称获得所需的类型?

4 个答案:

答案 0 :(得分:2)

当您传递名称空间限定名称时,

Type.GetType只能在mscorlib或当前程序集中找到类型。要使其工作,您需要“AssemblyQualifiedName”。

  

要获取的类型的程序集限定名称。看到   AssemblyQualifiedName。如果类型在当前正在执行   汇编或在Mscorlib.dll中,提供类型名称就足够了   由其命名空间限定。

参考Type.GetType

System.ServiceModel.NetNamedPipeBinding位于“System.ServiceModel.dll”中,因此Type.GetType无法找到它。

这将有效

Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).AssemblyQualifiedName)

或者,如果您知道程序集已经使用以下代码

assemblyOfThatType.GetType(fullName);//This just need namespace.TypeName

答案 1 :(得分:1)

如果你想使用简单的名字(而不是AssemblyQualifiedName),并且不要担心含糊不清,你可以尝试这样的事情:

    public static Type ByName(string name)
    {
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Reverse())
        {
            var tt = assembly.GetType(name);
            if (tt != null)
            {
                return tt;
            }
        }

        return null;
    }

Reverse() - 用于加载最近加载的类型(例如在从aspx编译代码之后)

答案 2 :(得分:0)

.Name为您提供NetNamedPipeBinding,为GetType工作,您需要完整的程序集名称(AssemblyQualifiedName)

答案 3 :(得分:0)

其他答案几乎是正确的。要按名称加载类型,您需要它的全名(如果程序集已加载到appdomain中)或其程序集限定名称。

全名是类型的名称,包括名称空间。你可以致电Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).FullName)来获得。在您的设计示例中,这将起作用(因为NetNamedPipeBinding的程序集可以确保加载)。

如果您无法确定它已加载,请使用Sriram的答案,并传递完整的程序集限定名称(TopNamespace.SubNameSpace.ContainingClass, MyAssembly )。这将使.NET尝试查找并加载htat程序集,然后获取类型。