从全名创建C#类型

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提供类型参数.

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

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

  • @Xaade,您可以通过以下方式获取所有程序集:`AppDomain.CurrentDomain.GetAssemblies()`. (5认同)
  • 那就是问题所在:System.Xml.XmlNode不是程序集中的类型,是吗?您需要使用正确的程序集,或者使用完整的程序集信息调用Type.GetType. (4认同)

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)

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


Wae*_*oul 7

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

string toNativeTypeName = "System.Int32";
Type t = Type.GetType(toNativeTypeName );
MessageBox.Show(t.FullName);
Run Code Online (Sandbox Code Playgroud)

  • 如果您知道条目程序集中的类型*是*,那么使用Assembly.GetType,其名称包括命名空间但*不*程序集名称可能比包括完整程序集名称(包括版本)更容易... (3认同)

Run*_*tad 5

您的类型名称很可能是错误的。如果您在代码中创建对类型的引用,然后检查其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