Adi*_*rda 15 c# types assemblies
我正在尝试从类型全名获取一个Type对象,我正在进行以下操作:
Assembly asm = Assembly.GetEntryAssembly();
string toNativeTypeName="any type full name";
Type t = asm.GetType(toNativeTypeName);
Run Code Online (Sandbox Code Playgroud)
我搞砸了,为什么?
程序集是我的可执行文件(.net可执行文件),类型名称是:System.Xml.XmlNode
Jon*_*eet 30
好吧,如果那真的是类型的全名(即包括名称空间)并且它在该程序集中,那么它应该可以工作.你能举个例子吗?当你正在使用Assembly.GetType
,而不是Type.GetType
你不应该包括在类型名称的程序集名称.
请注意,泛型类型的名称不是您所期望的.例如,你使用:
assembly.GetType("System.Collections.Generic.List`1");
Run Code Online (Sandbox Code Playgroud)
获取通用列表类型,然后用于Type.MakeGenericType
提供类型参数.
当然,只有当类型是通用的时候才有意义.如果那不是问题,我会仔细检查这个类型是否真的在你的入口组件中.
编辑:哦,请注意嵌套类型将是"容器+嵌套"而不是"容器.嵌套",如果这是相关的...
Tor*_*ell 10
请参阅下面的建议,仅为业务命名空间循环以获得速度
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");
}
Run Code Online (Sandbox Code Playgroud)
这是另一种方法:
Type t = System.Web.Compilation.BuildManager.GetType("the.type", true, false);
Run Code Online (Sandbox Code Playgroud)
使用反射器来看看它是如何完成的,至少为了好玩:)
你为什么要定义汇编来使用get type !,你也需要放置命名空间
string toNativeTypeName = "System.Int32";
Type t = Type.GetType(toNativeTypeName );
MessageBox.Show(t.FullName);
Run Code Online (Sandbox Code Playgroud)
您的类型名称很可能是错误的。如果您在代码中创建对类型的引用,然后检查其Type.FullName
属性,您将看到类型名称的外观。
您也可以尝试该Type.GetType
方法并查看它返回的内容。也许你的类型根本不在那个程序集中?
编辑:事实证明我使用 Type.FullName 属性是错误的。如果您使用 Type.AssemblyQualifiedName 属性,您将获得可供 Type.GetType 使用的完全限定名称。
对于 System.Xml.XmlNode,您将获得以下名称: System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
归档时间: |
|
查看次数: |
30629 次 |
最近记录: |