从全名创建C#类型

我正在尝试从类型全名获取一个Type对象我正在进行以下操作:

Assembly asm = Assembly.GetEntryAssembly(); string toNativeTypeName="any type full name"; Type t = asm.GetType(toNativeTypeName); 

我搞砸了,为什么?

程序集是我的可执行文件(.net可执行文件),类型名称是:System.Xml.XmlNode

好吧,如果那真的是类型的全名(即包括名称空间)并且它在该程序集中,那么它应该可以工作。 你能举个例子吗? 当您使用Assembly.GetType而不是Type.GetType不应在类型名称中包含程序集名称。

请注意,generics类型的名称不是您所期望的。 例如,你使用:

 assembly.GetType("System.Collections.Generic.List`1"); 

要获取通用列表类型,请使用Type.MakeGenericType提供类型参数。

当然,只有在类型是通用的时候才有意义。 如果那不是问题,我会仔细检查类型是否真的在您的入口组件中。

编辑:哦,请注意嵌套类型将是“容器+嵌套”而不是“容器。嵌套”,如果这是相关的…

请参阅下面的建议,仅为了速度循环业务名称空间

 private static Type GetBusinessEntityType(string typeName) { Debug.Assert(typeName != null); List 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); 

使用reflection器来看看它是如何完成的,至少为了好玩:)

你为什么要定义汇编来使用get type !,你也需要放置命名空间

 string toNativeTypeName = "System.Int32"; Type t = Type.GetType(toNativeTypeName ); MessageBox.Show(t.FullName); 

您的类型名称很可能是错误的。 如果在代码中创建对类型的引用,然后检查其Type.FullName属性,您将看到该类型的名称应该如何显示。

您还可以尝试使用Type.GetType方法并查看它返回的内容。 也许你的类型根本不在那个组件中?

编辑:事实certificate我使用Type.FullName属性是错误的。 如果使用Type.AssemblyQualifiedName属性,您将获得Type.GetType可以使用的完全限定名称。

对于System.Xml.XmlNode,您将获得以下名称: System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

我遇到了这个post,发现原来的问题还没有得到解答。 我可能是错的,但在阅读问题时,我认为作者的意图是能够简单地从被引用的程序集或应用程序的一部分中获取一个类型。

这就是我为解决这个问题所做的工作。

 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; }