Type.GetType(“namespace.abClassName”)返回null

此代码:

Type.GetType("namespace.abClassName") 

返回null

我已经在使用:

 using namespace.ab; 

更新:

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

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

如果这两个都不是真的,那么你需要一个组件限定的名字 。

你也可以得到没有程序集限定名的类型,但是也有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 ; } 
 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; } 

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

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

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

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

编辑:顺便说一句使用(因为我敢肯定你知道)只是在编译时编译器的指令,不能因此对API调用的成功有任何影响。 (如果你有项目或程序集引用,这可能会有影响 – 因此信息是无用的,只需要一些过滤…)

请参阅此如何检索程序集的限定类型名称? 有关如何获取程序集限定名的信息。

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

 typeof(namespace.abClassName) 

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

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

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

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

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

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

当我仅使用namesspace.classname获取不同程序集中的类的类型时,情况与此相同,并且不起作用。 只有当我包含我的类型字符串汇编信息如上所示。

如果你的类没有被当前assambly你必须给qualifiedName和这个代码显示如何获得class的限定名

 string qualifiedName = typeof(YourClass).AssemblyQualifiedName; 

然后你可以获得与qualifiedName的类型

 Type elementType = Type.GetType(qualifiedName); 

确保逗号紧接在完全限定名称之后

 typeof(namespace.abClassName, AssemblyName) 

因为这不会工作

 typeof(namespace.abClassName ,AssemblyName) 

我被困在这一个几天

那么,是的,如果类型不存在,则返回null。 使用无关紧要Type.GetType()。

所以,它表明你的类型不存在。 你有没有检查组件是否被加载?

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

 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和负载,所以我有一个穷人的插件架构。

写你的项目点击并清理。 尝试重建项目

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

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