【问题标题】:How to check types between a dynamically loaded Assembly and a referenced Assembly?如何检查动态加载的程序集和引用的程序集之间的类型?
【发布时间】:2025-12-24 21:00:16
【问题描述】:

简单地说,我正在做的是有效地为其他一些框架实现者制作一个具有一些有价值的框架特性的“形状包”。我将 Shape 包打包到一个类库中,然后继续编写测试实现。我动态加载 Shape 包 .dll 并将类型反映到程序集中。我可以创建对象、数据绑定到 DataGridViews 以及我喜欢的任何其他东西 - 但我无法通过像

这样的简单检查
if (squareObject is Shape)
or
if (Square.IsSubclassOf(Shape))

举个例子—— 如果我有一个包含一个类的类库:

namespace Shapes
{
    public class Shape
    {
        public string UsefulShapeProperty { get; set; }
    }
}

然后我创建一个具有一个类的实现库(引用 Shapes 库):

namespace MyShapes
{
    public class UselessShape : Shapes.Shape
    {
        public string Description { get; set; }
    }
}

最后,我创建了第三个项目,它引用 Shapes 库并动态加载实现库,例如 MyShapes:

using Shapes;
public class ShapeChecker
{
    ... (Constructor, some means to load and reflect the types from UselessShapes.dll, omitted for brevity and clarity)
    public void Report(Type typeToCheck)
    {
        if (typeToCheck.IsSubclassOf(typeof(Shapes.Shape)))
            Console.WriteLine("Rejoice, for " + typeToCheck.ToString() + " is a Shape!");
    }
}

我从来没有听过“欢欣鼓舞”。我还使用了 Activator.CreateInstance 并检查了返回的对象。 Activator 给了我一个 UselessShape 对象,但类型检查失败。

如何在动态加载的程序集中检查某些已知类型(如 Shape)的实现,这样我就不需要 ShapeChecker 了解有关 MyShapes 包的任何特殊信息?

【问题讨论】:

  • ShapeChecker 中的Shape 是什么? typeToCheck 是什么? (一个简短但完整的示例在这里会很有帮助。)
  • 你是绝对正确的。我在原始示例中输入错误 System.Type 的 IsInstanceOfType 方法。我已经更新了更多的正确性和清晰度。谢谢! msdn.microsoft.com/en-us/library/…

标签: c# .net reflection


【解决方案1】:

好的,我认为问题在于您使用了错误的方法。

目前您在问Shape类型 是否是Shape 的实例...而不是。

我怀疑你想要Type.IsAssignableFrom

if (typeof(Shapes.Shape).IsAssignableFrom(typeToCheck))

请注意,我在这里颠倒了目标/参数。我认为我的方法是正确的,但我总是必须检查...

【讨论】:

  • 这也行不通。我已经尝试了两种方法并仔细跟踪了调试器。传入的 UselessShape 类型是具有适当命名的 Shape BaseType 属性的 RuntimeType - IsAssignableFrom 始终为 false,并且显式类型转换会引发异常。
  • @Kenny:嗯,这绝对是你想要开始工作的方法。我会仔细检查 BaseType - 特别是检查typeToCheck.BaseType == typeof(Shape)。我怀疑你会发现它不是,这意味着从两个不同的程序集加载相同的类型。
  • 非常感谢您,斯基特先生。碰巧我从一个明显不正确的位置加载测试 dll,甚至导致 typeToCheck.BaseType 的递归测试失败。 PBKAC,这通常是正确的。
最近更新 更多