如何检查动态加载的程序集和引用的程序集之间的类型?

时间:2013-03-01 23:47:17

标签: c# .net reflection

简单地说,我正在做的是有效地为一些其他框架实现者创建一个具有一些有价值的框架功能的“Shape包”。我将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包的任何特殊内容?

1 个答案:

答案 0 :(得分:1)

好的,我认为问题只是你使用了错误的方法。

目前,您正在询问Shape类型Shape的实例......而且不是。

我怀疑你想要Type.IsAssignableFrom

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

请注意,我在这里反转了目标/参数。我我已经得到了正确的方法,但我总是必须检查......