0

インターフェイスを実装するクラスがいくつかあります。

class FirstImplementer : IInterface { ... }
class AnotherImplementer : IInterface { ... }

コードのどこかで、IInterface のインスタンスのリストを取得しました。

List<IInterface> MyList;

IInterface インスタンスごとに、その特定のインスタンスのインプリメンター クラス (FirstImplementer または AnotherImplementer) を知りたいです。

4

4 に答える 4

2

.GetType()インスタンスで使用するだけでMyList、そこから移動できます。

MyList[0].GetType()typeof(FirstImplementer)>他と同じです。

于 2013-04-04T20:19:07.453 に答える
1
foreach (var item in MyList)
{
    var theType = item.GetType();
    // why did you want theType, again?
    // you generally shouldn't be concerned with how your interface is implemented
}

何をしようとしているのかによっては、この代替手段がより便利な場合があります。

foreach (var item in MyList)
{
    if (item is FirstImplementer)
    {
        var firstImpl = (FirstImplementer)item;
        // do something with firstImpl
    }
    else if (item is AnotherImplementer)
    {
        var anotherImpl = (AnotherImplementer)item;
        // do something with anotherImpl
    }
}

通常は、isまたはasオーバー リフレクション (例: GetType) を使用することが理にかなっている場合に適しています。

于 2013-04-04T20:19:16.813 に答える
0

最初の型引数がある場合はそれを取得する必要があり、リスト内の各インスタンスに対してそのような型引数が存在しない場合は null を取得する必要がある場合は、設計時にインターフェイス参照として構文的に観察すると、Type 型の GetGenericArguments メソッドを使用できます。

これは、null の可能性がある一連のオブジェクトを受け取る小さなヘルパー メソッドですが、そうでない場合は確実にインターフェイスを実装し (実行時の型を持つ)、(それぞれの順序で) を表す一連の型を生成します。 ) SomeImplementer パターンで発見された型引数:

public IEnumerable<Type> GetTypeArgumentsFrom(IEnumerable<IInterface> objects) {
    foreach (var obj in objects) {
        if (null == obj) {
            yield return null; // just a convention 
                               // you return null if the object was null
            continue;
        }

        var type = obj.GetType();
        if (!type.IsGenericType) {
            yield return null;
            continue;
        }

        yield return type.GetGenericArguments()[0];
    }
}
于 2013-04-04T20:40:20.340 に答える