按名称获取类型

问题描述 投票:0回答:5

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

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

返回空。为什么?以及如何通过名称获取所需的类型?

c# visual-studio-2012 .net-4.5
5个回答
17
投票

如果您想使用简单的名称(而不是 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 编译代码后)


9
投票
当您传递命名空间限定名称时,

Type.GetType
只能查找
mscorlib
或当前程序集中的类型。要使其工作,您需要“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

4
投票

基于 Vladimir 的答案,这里是一个 LINQ 版本,其中包含回退到第一个部分结果的可选部分如果未找到精确匹配:

private static Type ByName(string name)
{
    return
        AppDomain.CurrentDomain.GetAssemblies()
            .Reverse()
            .Select(assembly => assembly.GetType(name))
            .FirstOrDefault(t => t != null)
        // Safely delete the following part
        // if you do not want fall back to first partial result
        ??
        AppDomain.CurrentDomain.GetAssemblies()
            .Reverse()
            .SelectMany(assembly => assembly.GetTypes())
            .FirstOrDefault(t => t.Name.Contains(name));
}

0
投票

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


0
投票

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

全名是类型的名称,包括命名空间。您可以通过拨打

Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).FullName)
来获取。在您设计的示例中,这将起作用(因为确保加载
NetNamedPipeBinding
的程序集)。

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

© www.soinside.com 2019 - 2024. All rights reserved.