此代码:
Type.GetType("namespace.a.b.ClassName")
返回null
。
我在使用中有:
using namespace.a.b;
更新
类型存在,它位于不同的类库中,我需要通过字符串名称来获取它。
答案 0 :(得分:204)
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和加载,因此我有一个穷人的插件架构。