从全名创建C#类型

时间:2009-09-08 08:43:43

标签: c# assemblies types

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

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

我得到空,为什么?

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

5 个答案:

答案 0 :(得分:27)

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

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

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

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

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

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分: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;
}