簡単に言えば、私がやっていることは、他のフレームワークの実装者のために、いくつかの貴重なフレームワーク機能を備えた「Shape パッケージ」を効果的に作成することです。Shape パッケージをクラス ライブラリにパッケージ化し、テスト実装の作成に進みます。Shape パッケージ .dll を動的に読み込み、アセンブリから型を反映します。オブジェクトを作成したり、DataGridViews にデータをバインドしたり、好きなものを作成したりできますが、次のような単純なチェックに合格することはできません
if (squareObject is Shape)
or
if (Square.IsSubclassOf(Shape))
例として-1つのクラスを持つクラスライブラリがある場合:
namespace Shapes
{
public class Shape
{
public string UsefulShapeProperty { get; set; }
}
}
次に、1 つのクラス (Shapes ライブラリを参照) を持つ実装ライブラリを作成します。
namespace MyShapes
{
public class UselessShape : Shapes.Shape
{
public string Description { get; set; }
}
}
最後に、Shapes ライブラリを参照し、MyShapes などの実装ライブラリを動的に読み込む 3 番目のプロジェクトを作成します。
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 オブジェクトを提供しますが、型チェックは失敗します。
MyShapes パッケージについて特別なことを知るために ShapeChecker を必要としないように、動的に読み込まれたアセンブリで特定の既知の型 (Shape など) の実装を確認するにはどうすればよいですか?