是否可以在运行时从给定的程序集中获取抽象类型?
我目前正在加载我的程序集:
Assembly assem = Assembly.LoadFrom("MyAssemblyName.dll");
但后来我想这样做:
Type t = assem.GetType("Enterprise.Shared_Party_PersonType");
我的课程定义为:
public abstract class Shared_Party_PersonType
但是类型t返回null。
我的最终目标是使用反射导航抽象类并获取列表 该抽象类的属性类似于它们在此处执行的操作:access-to-properties-of-abstract-class-with-reflection
非常感谢任何帮助。
解决方案:原来我正在加载错误版本的DLL,它不包含我尝试加载的抽象类型。但是,现在我知道您可以使用反射来导航和操作抽象类型,就像任何其他具体类型一样。我还了解了Assembly.RefelectionOnlyLoadFrom
方法,感谢@Fuex在仅反射上下文中加载程序集
答案 0 :(得分:4)
是的,您可以获得任何类型,甚至是界面。只需确保指定它的全名,包括命名空间:
Type t = assem.GetType("SomeNamespace.AnAbstractClassName", true);
完整示例:
using System;
using System.Reflection;
namespace SomeNs
{
public abstract class Foo
{
}
}
public class Program
{
static void Main()
{
var asm = Assembly.GetExecutingAssembly();
var type = asm.GetType("SomeNs.Foo", true);
Console.WriteLine(type);
}
}
答案 1 :(得分:1)
我只需要递归地检查抽象类型属性 提取满足特定条件的绑定路径。
如果你只是需要检查类型信息,那么Assembly.LoadFrom()
因为Assembly.ReflectionOnlyLoadFrom()
可以产生不可思议的影响。
所以试试:
Assembly asm = Assembly.ReflectionOnlyLoadFrom("mypath");
Type t = asm.GetType("FullName");
答案 2 :(得分:1)
也许你的类是在其他类中定义的。在这种情况下,您必须使用+
(加号)而不是.
(点)。像这样:
assem.GetType("OutermostNamespace.InnerNamespace.Enterprise+Shared_Party_PersonType")
其中Enterprise
是在内部定义Shared_Party_PersonType
的“外部”类或结构。
否则,您可以访问MyAssemblyName.dll的源代码吗?然后你可以尝试查看string n = typeof(Shared_Party_PersonType).FullName
在那里返回的内容,以检查类型名称是否真的是你想要的。