我有一个方法,需要解析一个类的类型。此类存在于另一个程序集中,其命名空间类似于:
MyProject.Domain.Model
我正在尝试执行以下操作:
Type.GetType("MyProject.Domain.Model." + myClassName);
如果执行此操作的代码与我试图解析其类型的类位于同一程序集中,则此方法非常有效。但是,如果我的类位于不同的程序集中,则此代码将失败。
我确信有一种更好的方法来完成这项任务,但我在解析程序集和遍历命名空间以解析我要查找的类类型方面没有太多经验。有什么建议或技巧可以更优雅地完成这项任务吗?
发布于 2010-08-18 21:03:53
您必须像这样添加程序集名称:
Type.GetType("MyProject.Domain.Model." + myClassName + ", AssemblyName");
为避免歧义或如果程序集位于GAC中,应提供完全限定的程序集名称,如下所示:
Type.GetType("System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
发布于 2016-06-27 15:17:14
首先加载程序集,然后加载类型。
示例:
Assembly DLL = Assembly.LoadFile(PATH);
DLL.GetType(typeName);
发布于 2019-05-29 15:17:58
与OP类似,我需要按名称加载有限的类型子集(在我的示例中,所有类都在单个程序集中,并实现相同的接口)。在尝试对不同的程序集使用Type.GetType(string)
时(甚至添加了其他帖子中提到的AssemblyQualifiedName ),我遇到了很多奇怪的问题。下面是我是如何解决这个问题的:
用法:
var mytype = TypeConverter<ICommand>.FromString("CreateCustomer");
代码:
public class TypeConverter<BaseType>
{
private static Dictionary<string, Type> _types;
private static object _lock = new object();
public static Type FromString(string typeName)
{
if (_types == null) CacheTypes();
if (_types.ContainsKey(typeName))
{
return _types[typeName];
}
else
{
return null;
}
}
private static void CacheTypes()
{
lock (_lock)
{
if (_types == null)
{
// Initialize the myTypes list.
var baseType = typeof(BaseType);
var typeAssembly = baseType.Assembly;
var types = typeAssembly.GetTypes().Where(t =>
t.IsClass &&
!t.IsAbstract &&
baseType.IsAssignableFrom(t));
_types = types.ToDictionary(t => t.Name);
}
}
}
}
显然,您可以调整CacheTypes方法以检查AppDomain中的所有程序集,或者更适合您的用例的其他逻辑。如果您的用例允许从多个命名空间加载类型,则可能需要更改字典键以使用类型的FullName
。或者,如果您的类型不是从公共接口或基类继承的,则可以删除<BaseType>
并将CacheTypes方法更改为使用类似.GetTypes().Where(t => t.Namespace.StartsWith("MyProject.Domain.Model.")
的方法
https://stackoverflow.com/questions/3512319
复制相似问题