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