0

是否可以在运行时从给定的程序集中获取抽象类型?

我目前正在加载我的程序集:

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,我还了解了在仅反射上下文中加载程序集的方法

4

3 回答 3

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);
    }
}
于 2012-08-14T19:52:59.630 回答
1

也许您的类是在其他类中定义的。在这种情况下,您必须使用+(加号)而不是.(点)。像这样:

assem.GetType("OutermostNamespace.InnerNamespace.Enterprise+Shared_Party_PersonType")

whereEnterprise是内部定义的“外部”类或结构Shared_Party_PersonType

否则,您可以访问 MyAssemblyName.dll 的源代码吗?然后您可能会尝试查看string n = typeof(Shared_Party_PersonType).FullName那里返回的内容,以检查类型名称是否真的是您所假设的。

于 2012-08-14T20:51:00.840 回答
1

我只需要递归地检查抽象类型属性以提取满足某些条件的绑定路径。

如果Assembly.LoadFrom()您只需要检查类型信息,最好的解决方案是使用Assembly.ReflectionOnlyLoadFrom().

所以试试:

Assembly asm = Assembly.ReflectionOnlyLoadFrom("mypath");
Type t = asm.GetType("FullName");
于 2012-08-14T20:34:22.930 回答