Answers:
Type.GetType("namespace.qualified.TypeName")
仅当在mscorlib.dll或当前正在执行的程序集中找到该类型时才起作用。
如果这两种情况都不成立,则需要一个程序集限定名称:
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
,然后使用名称从程序集-加载类型,而不必使用程序集限定名称Type t = a.GetType("namespace.a.b.ClassName");
。
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
节省点麻烦,最终
您还可以获取不带程序集限定名但带有dll名称的类型,例如:
Type myClassType = Type.GetType("TypeName,DllName");
我有同样的情况,对我有用。我需要一个类型为“ DataModel.QueueObject”的对象,并且具有对“ DataModel”的引用,所以我得到的类型如下:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
逗号后的第二个字符串是引用名称(dll名称)。
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
尝试使用这种方法
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 ;
}
AppDomain
不受支持,因此不适用于UWP 。不确定是否有其他选择。
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;
}
T
通用类型的会被剥离。
如果您的班级不在当前级别,则必须提供qualifiedName,此代码显示如何获取班级的qualifiedname
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
然后您可以使用qualifiedName获得类型
Type elementType = Type.GetType(qualifiedName);
如果是嵌套类型,则您可能会忘记转换。到+
无论如何,typeof( T).FullName
都会告诉您您应该说什么
编辑:顺便说一下,using(我确定您知道)只是在编译时对编译器的指令,因此不会对API调用的成功产生任何影响。(如果您有项目或程序集引用,则可能会产生影响-因此信息并不是没有用的,它只需要进行一些过滤...)
+
分隔符)
我将根据数据库中指定用户有权访问的用户控件来打开用户控件。所以我用这种方法来获取TypeName ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
因此,现在可以使用strType中返回的值来创建该对象的实例。
由于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);
不需要版本,区域性和PublicKeyToken assemblyName
,因此您可以使用MyAssembly.GetName()。Name。
如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。
尝试使用包含程序集信息的完整类型名称,例如:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
当我仅使用namesspace.classname来获取不同程序集中的类的类型时,我遇到了相同的情况,并且无法正常工作。如上所示,仅当我在类型字符串中包含程序集信息时,此方法才有效。
对我来说,“ +”是关键!这是我的课(是一个嵌套的课):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
这行代码行得通:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
这上面的解决方案似乎是最好的给我,但它并没有为我工作,所以我做到了,如下所示:
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,因此我有一个穷人的插件体系结构。