在我的代码中,我试图按名称获取类型。当我使用字符串参数时,我失败了。然后我尝试在快速监视窗口中执行以下操作:
Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).Name)
返回空。为什么?以及如何通过名称获取所需的类型?
如果您想使用简单的名称(而不是 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 编译代码后)
Type.GetType
只能查找mscorlib
或当前程序集中的类型。要使其工作,您需要“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
基于 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));
}
.Name 为您提供 NetNamedPipeBinding,要使 GetType 正常工作,您需要完整的程序集名称 (AssemblyQualifiedName)
其他答案几乎都是对的。要按名称加载类型,您需要它的全名(如果程序集已加载到应用程序域中)或其程序集限定名称。
全名是类型的名称,包括命名空间。您可以通过拨打
Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).FullName)
来获取。在您设计的示例中,这将起作用(因为确保加载 NetNamedPipeBinding
的程序集)。
如果您无法确定它已加载,请使用 Sriram 的答案,并传递完整的程序集限定名称(TopNamespace.SubNameSpace.ContainingClass,MyAssembly)。这将使 .NET 尝试查找并加载 htat 程序集,然后获取类型。