1

简单地说,我正在做的是有效地为其他一些框架实现者制作一个具有一些有价值的框架特性的“形状包”。我将 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 包的任何特殊信息?

4

1 回答 1

1

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

目前,您在询问 of 的类型是否Shape是 ... 的实例,Shape但不是。

我怀疑你想要Type.IsAssignableFrom

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

请注意,我在这里颠倒了目标/论点。我我的方法是正确的,但我总是要检查......

于 2013-03-01T23:59:19.773 回答