Type.GetType(“namespace.a.b.ClassName”)返回null

时间:2009-12-01 09:53:15

标签: c# reflection

此代码:

Type.GetType("namespace.a.b.ClassName")

返回null

我在使用中有:

using namespace.a.b;

更新

类型存在,它位于不同的类库中,我需要通过字符串名称来获取它。

15 个答案:

答案 0 :(得分:204)

只有在mscorlib.dll或当前正在执行的程序集中找到类型时,

Type.GetType("namespace.qualified.TypeName")才有效。

如果这些都不属实,那么您需要assembly-qualified name

Type.GetType("namespace.qualified.TypeName, Assembly.Name")

答案 1 :(得分:168)

您也可以获取没有程序集限定名称的类型,但也可以使用dll名称,例如:

Type myClassType = Type.GetType("TypeName,DllName");

我有同样的情况,它对我有用。我需要一个“DataModel.QueueObject”类型的对象,并引用了“DataModel”,所以我得到的类型如下:

Type type = Type.GetType("DataModel.QueueObject,DataModel");

逗号后面的第二个字符串是引用名称(dll名称)。

答案 2 :(得分:71)

尝试使用此方法

 public static Type GetType(string typeName)
        {
            var type = Type.GetType(typeName);
            if (type != null) return type;
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                type = a.GetType(typeName);
                if (type != null)
                    return type;
            }
            return null ;
        }

答案 3 :(得分:24)

Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
    lock (typeCache) {
        if (!typeCache.TryGetValue(typeName, out t)) {
            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
                t = a.GetType(typeName);
                if (t != null)
                    break;
            }
            typeCache[typeName] = t; // perhaps null
        }
    }
    return t != null;
}

答案 4 :(得分:23)

如果程序集是ASP.NET应用程序构建的一部分,则可以使用BuildManager类:

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);

答案 5 :(得分:10)

如果您的类不在当前的assambly中,则必须提供qualifiedName,此代码显示如何获取class的qualifiedname

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

然后你可以获得带有qualifiedName的类型

Type elementType = Type.GetType(qualifiedName);

答案 6 :(得分:8)

如果它是嵌套类型,您可能忘记转换a。到了+

无论如何,typeof( T).FullName会告诉你应该说什么

编辑:BTW使用(我相信你知道)只是编译时编译器的指令,因此不会对API调用的成功产生任何影响。 (如果您有项目或程序集引用,可能会产生影响 - 因此信息无用,只需要进行一些过滤......)

答案 7 :(得分:6)

我打开用户控件,具体取决于用户有权访问数据库中指定的用户控件。所以我用这个方法来获取TypeName ...

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))

所以现在可以使用strType中返回的值来创建该对象的实例。

答案 8 :(得分:4)

如果引用了程序集并且Class可见:

typeof(namespace.a.b.ClassName)

GetType返回null,因为找不到类型,使用typeof,编译器可以帮助您找出错误。

答案 9 :(得分:4)

尝试使用包含装配信息的完整类型名称,例如:

string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);

当我只使用namesspace.classname来获取不同程序集中的类的类型时,我遇到了同样的情况,但它不起作用。仅当我将汇编信息包含在我的类型字符串中时才有效。如上所示。

答案 10 :(得分:3)

确保逗号直接位于完全限定名称

之后
typeof(namespace.a.b.ClassName, AssemblyName)

因为这不会起作用

typeof(namespace.a.b.ClassName ,AssemblyName)

我在这一天被困了几天

答案 11 :(得分:2)

由于Type.GetType(String)需要Type.AssemblyQualifiedName,您应该使用Assembly.CreateQualifiedName(String, String)

string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);

作为assemblyName,您不需要FullName,只需要名称而不需要版本,文化和PublicKeyToken。

答案 12 :(得分:1)

上面的

This解决方案对我来说似乎是最好的,但它对我没有用,所以我这样做了:

AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);

Type myType = Type.GetType(typeAssemblyQualifiedName);

前提条件是您知道装配的路径。在我的情况下,我知道它,因为这是一个由另一个内部项目构建的程序集,它包含在我们项目的bin文件夹中。

如果重要的是我使用的是Visual Studio 2013,我的目标.NET是4.0。这是一个ASP.NET项目,所以我通过HttpContext获得绝对路径。但是,绝对路径不是必需的,因为它似乎来自MSDN on AssemblyQualifiedNames

答案 13 :(得分:1)

对我来说,&#34; +&#34;是关键! 这是我的班级(它是嵌套的):

namespace PortalServices
{
public class PortalManagement : WebService
{
    public class Merchant
    {}
}
}

并且这行代码有效:

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");

答案 14 :(得分:0)

我被骗了。由于我想要创建的类型(按名称)都在我控制的一个dll中,我只是在一个带有简单名称的程序集中的dll中放入一个静态方法,并从该上下文中调用type.GetType并返回结果

最初的目的是在配置数据中按名称指定类型。我已经改变了代码,以便用户指定要处理的格式。格式处理程序类实现一个接口,该接口确定该类型是否可以解析指定的格式。然后我使用反射来查找实现该接口的类型,并找到一个处理该格式的类型。所以现在配置指定格式名称,而不是特定类型。反射代码可以查看相邻的dll和加载,因此我有一个穷人的插件架构。