我正在尝试从类型全名获取 Type 对象,我正在执行以下操作:
Assembly asm = Assembly.GetEntryAssembly();
string toNativeTypeName="any type full name";
Type t = asm.GetType(toNativeTypeName);
我得到空值,为什么?
程序集是我的可执行文件(.net 可执行文件),类型名称是:System.Xml.XmlNode
好吧,如果这确实是类型的全名(即包括命名空间)并且它位于该程序集中,那么它应该可以工作。你能举个例子吗?当您使用
Assembly.GetType
而不是 Type.GetType
时,您不应该 在类型名称中包含程序集名称。
请注意,泛型类型的名称并不是您所期望的名称。例如,您可以使用:
assembly.GetType("System.Collections.Generic.List`1");
获取通用列表类型,然后使用
Type.MakeGenericType
提供类型参数。当然,这仅在类型为泛型时才相关。如果这不是问题,我会仔细检查该类型是否确实在您的入口程序集中。
编辑:哦,请注意,嵌套类型将是“Container+Nested”而不是“Container.Nested”(如果相关的话)...
private static Type GetBusinessEntityType(string typeName)
{
Debug.Assert(typeName != null);
List<System.Reflection.Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName.StartsWith("AF.BusinessEntities")).ToList();
foreach (var assembly in assemblies)
{
Type t = assembly.GetType(typeName, false);
if (t != null)
return t;
}
throw new ArgumentException(
"Type " + typeName + " doesn't exist in the current app domain");
}
还有另一种方法:
Type t = System.Web.Compilation.BuildManager.GetType("the.type", true, false);
使用反射器看看它是如何完成的,至少是为了好玩:)
string toNativeTypeName = "System.Int32";
Type t = Type.GetType(toNativeTypeName );
MessageBox.Show(t.FullName);
Type.FullName
属性,您将看到类型名称的外观。您也可以尝试
Type.GetType
方法并查看它返回什么。也许您的类型根本不在该程序集中?更新 – 使用
Type.AssemblyQualifiedName
:事实证明我使用
Type.FullName
属性是错误的。如果您使用
Type.AssemblyQualifiedName
属性,您将获得
Type.GetType
可以使用的完全限定名称。对于
System.Xml.XmlNode
,您将获得以下名称:
System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
这就是我为解决该问题所做的事情。
public static Type GetTypeFromFullName(string fullClassName)
{
AssemblyPartCollection parts = Deployment.Current.Parts;
foreach (var part in parts)
{
Uri resUri = new Uri(part.Source, UriKind.Relative);
Stream resStream = Application.GetResourceStream(resUri).Stream;
Assembly resAssembly = part.Load(resStream);
Type tryType = resAssembly.GetType(fullClassName, false);
if (tryType != null)
return tryType;
}
return null;
}