从全名创建 C# 类型

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

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

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

我得到空值,为什么?

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

c# assemblies types
5个回答
32
投票

好吧,如果这确实是类型的全名(即包括命名空间)并且它位于该程序集中,那么它应该可以工作。你能举个例子吗?当您使用

Assembly.GetType
而不是
Type.GetType
时,您不应该 在类型名称中包含程序集名称。

请注意,泛型类型的名称并不是您所期望的名称。例如,您可以使用:

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

获取通用列表类型,然后使用

Type.MakeGenericType

 提供类型参数。

当然,这仅在类型为泛型时才相关。如果这不是问题,我会仔细检查该类型是否确实在您的入口程序集中。

编辑:哦,请注意,嵌套类型将是“Container+Nested”而不是“Container.Nested”(如果相关的话)...


11
投票
请参阅下面我的建议,仅循环业务名称空间以提高速度

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

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


8
投票
为什么要定义程序集以使用 get 类型!,还需要放置命名空间

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

8
投票
您的类型名称很可能是错误的。如果您在代码中创建对类型的引用,然后检查其

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

    


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

这就是我为解决该问题所做的事情。

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; }
    
© www.soinside.com 2019 - 2024. All rights reserved.