如何从加载的程序集C#中获取抽象类型?

时间:2012-08-14 19:52:12

标签: c# reflection runtime abstract .net-assembly

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

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

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在仅反射上下文中加载程序集

3 个答案:

答案 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在那里返回的内容,以检查类型名称是否真的是你想要的。