0

特定の名前空間を検索し、指定されたインターフェイスを実装し、指定された基本クラスを持つすべてのクラスのインスタンスを返そうとしています。

ここにコードがあります

private List<T> GetInstancesWithInterface<T, T2>(string @namespace)
{
    var tList = Assembly.GetExecutingAssembly()
                         .GetTypes()
                         .Where(t => t.Namespace == @namespace)
                         .Where(t => t.BaseType == (typeof (T)) && t.GetInterfaces().Contains(typeof(T2)))
                         .Select(t => (T)Activator.CreateInstance(typeof(T), this))
                         .ToList();
    return tList;
}

そして、ここに呼び出しコードがあります

var examples = GetInstancesWithInterface<DrawableGameComponent, IResettable>("GamePhysics.Physics");

foreach (var example in examples)
{
    Debug.Assert(example is IResettable);
    var r = example as IResettable;
    _examples.Add(r);
    Components.Add(example);
    if (Components.Count == 0) continue;
    example.Enabled = false;
    example.Visible = false;
}

私が抱えている問題は、コードが常にnullを返すようDrawableGameComponentに処理できないリストを取得するため、Assertが失敗することです。IResettablevar r = example as IResettable

追加情報

インターフェイスDrawableGameComponentを実装していないことにも言及する必要がありました。IResettable私が取得しようとしている 3 つのサンプル クラスはすべてDrawableGameComponent基本クラスとしてあり、実装もしていますIResettable

追加の考え

Exampleおそらく、実装DrawableGameComponentと呼ばれる新しい抽象クラスを作成する必要があると考えていました。そうすればIResettable、具体的な例のクラスはExample基本クラスを実装できます。これはより良い設計かもしれないと思いますが、そのまま機能させることができるかどうかも知りたいです.

4

2 に答える 2

4

に間違った型を渡しています。次のActivator.CreateInstanceように変更する必要があります。

.Select(t => (T)Activator.CreateInstance(t, this))

基本クラスを直接見る代わりに、句でType.IsSubclassOf使用することもできます。Where

于 2013-06-24T17:25:19.260 に答える
3

(コメントで要求されたとおりに投稿します。お待たせしました)

SelectLINQ クエリの次の部分を見てください。

.Select(t => (T)Activator.CreateInstance(typeof(T), this))

に渡すと、タイプ の新しいオブジェクトが作成typeof(T)されます。見つかった型から実際にオブジェクトを作成しようとしているので、これを次のように変更する必要があります。Activator.CreateInstanceT

.Select(t => (T)Activator.CreateInstance(t, this))

これにより、Activator が前の で見つかったタイプのインスタンスを確実に作成しますWhere

リーも述べたように、サブクラスを検索するときは、式でIsSubclassOforのようなものを使用することをお勧めします。私の経験から言えば、インターフェイスでも機能することを除いて、それらはほぼ同じように機能します。IsAssignableFromWhere==IsAssignableFrom

于 2013-06-24T19:04:21.577 に答える