在我的代码中,我试图按名称获取类型。当我使用字符串参数时,我失败了。然后我试着在快速观察窗口中进行以下操作:
Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).Name)
返回null。为什么?以及如何按名称获得所需的类型?
答案 0 :(得分:2)
Type.GetType
只能在mscorlib
或当前程序集中找到类型。要使其工作,您需要“AssemblyQualifiedName”。
要获取的类型的程序集限定名称。看到 AssemblyQualifiedName。如果类型在当前正在执行 汇编或在Mscorlib.dll中,提供类型名称就足够了 由其命名空间限定。
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程序集,然后获取类型。