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

这段代码:

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

返回null

我在使用:

using namespace.a.b;

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

216222 次浏览

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

如果这两个都不是真的,你需要一个assembly-qualified名字:

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

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

typeof(namespace.a.b.ClassName)

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

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

不管怎样,typeof( T).FullName会告诉你应该说什么

编辑:顺便说一句,这些用法(我相信你知道)只是编译时对编译器的指令,因此不会对API调用的成功产生任何影响。(如果你有项目或装配的参考资料,可能会有潜在的影响-因此信息不是无用的,只是需要一些过滤…)

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

尝试使用包含程序集信息的完整类型名称,例如:

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

当我只使用名称空间时,也遇到了同样的情况。Classname来获取不同程序集中的类类型,这将不起作用。只有在如上所示的类型字符串中包含程序集信息时才有效。

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

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

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

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

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

试试这个方法。

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

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

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

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

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

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

上面的解决方案似乎对我来说是最好的,但它不适合我,所以我这样做:

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中可以看出,绝对路径并不是必需的

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

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

如果你的类不在当前程序集中,你必须给出qualifiedName,这段代码显示了如何获得类的qualifiedName

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

然后你可以用qualifiedName获取type

Type elementType = Type.GetType(qualifiedName);

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

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

因为这不会起作用

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

在这件事上我被难住了好几天

当我只有类名时,我使用这个:

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
对我来说,“+”是关键! 这是我的类(它是一个嵌套的):

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

这行代码起作用了:

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

因为Type.GetType(字符串)需要类型。AssemblyQualifiedName,你应该使用Assembly.CreateQualifiedName(字符串,字符串)

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

Version, Culture和PublicKeyToken对于assemblyName来说是不需要的,这就是为什么你可以使用MyAssembly.GetName(). name。

关于Type.GetType(字符串):

如果类型是当前正在执行 在Mscorlib.dll中,提供类型名就足够了

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

在Visual Studio中,你的类的Build Action被设置为“__abc1”的可能性非常非常小。而不是"Compile"

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

检查“构建动作”是“编译”,而不是“内容”。