这段代码:

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

返回null。

我在使用:

using namespace.a.b;

类型是存在的,它在不同的类库中,我需要通过它的名字string来获取它。


当前回答

type . gettype ("namespace.qualified.TypeName")仅在mscorlib.dll或当前正在执行的程序集中找到该类型时才有效。

如果这两种情况都不是真的,你将需要一个程序集限定的名称:

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

其他回答

上面的解决方案对我来说似乎是最好的,但对我来说并不管用,所以我这样做了:

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上的AssemblyQualifiedNames来看,绝对路径并不是必需的

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

对我来说,“+”是关键! 这是我的类(它是一个嵌套的):

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

这行代码起作用了:

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

非常晚的回复,但如果有人在十年后处理这个问题:

有一个非常非常小的机会,你的类在Visual Studio的构建动作设置为“内容”而不是“编译”。

在“解决方案资源管理器”中单击类,然后查看属性。

检查Build Action是“Compile”,而不是“Content”。

你也可以得到不带程序集限定名但带有dll名的类型,例如:

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

我也遇到过同样的情况,这招对我很管用。我需要一个DataModel类型的对象。QueueObject”,并有一个引用“DataModel”,所以我得到的类型如下:

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

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