【问题标题】:How to get Abstract type from loaded assembly C#?如何从加载的程序集 C# 中获取抽象类型?
【发布时间】:2012-08-14 19:52:11
【问题描述】:

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

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

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,它不包含我试图加载的抽象类型。但是,现在我知道您可以像任何其他具体类型一样使用反射来导航和操作抽象类型。由于@Fuex 在仅反射上下文中加载程序集,我还了解了Assembly.RefelectionOnlyLoadFrom 方法

【问题讨论】:

  • 是的,它是公开的:public abstract class Shared_Party_PersonType
  • @Adolfo 你只需要检查信息或调用/实例化类型吗?
  • @Fuex 我只需要递归检查抽象类型属性以提取满足某些条件的绑定路径。
  • 好的,我发布了我的解决方案。

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


【解决方案1】:

是的,您可以获得任何类型,甚至是接口。只需确保指定它的全名,包括命名空间:

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);
    }
}

【讨论】:

  • 我用命名空间指定全名,但返回 null。即使我手动检查 assem.GetTypes() 枚举也不存在,但它肯定在 DLL 中。我可以在对象浏览器中看到它。
  • 也许您引用了一些不包含该类型的旧版本的程序集。无论如何,这应该工作。 GetType 方法允许您从程序集中检索抽象类型。即使它们是内部的。
  • 这很奇怪,当我的抽象类是解决方案的一部分时它可以工作,类似于您的示例。但是当我用Assembly.LoadFrom 加载我的外部程序集时不起作用。我不知道为什么...
【解决方案2】:

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

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

其中Enterprise 是在内部定义Shared_Party_PersonType 的“外部”类或结构。

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

【讨论】:

  • 谢谢@JeppeStigNielsen 原来我加载了错误版本的 DLL。在尝试了您的建议后我想通了。
【解决方案3】:

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

因为Assembly.LoadFrom() 可能会产生不良影响,如果您只需要检查类型信息,最好的解决方案是使用Assembly.ReflectionOnlyLoadFrom()

那就试试吧:

Assembly asm = Assembly.ReflectionOnlyLoadFrom("mypath");
Type t = asm.GetType("FullName");

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多