从接口实例获取实现者类实例

时间:2013-04-04 20:17:23

标签: c# reflection interface

我有一些实现接口的类:

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

在代码的某处,我得到了一个IInterface实例列表。

List<IInterface> MyList;

我想知道每个IInterface实例的特定实例(FirstImplementer或AnotherImplementer)的实现者类是什么。

4 个答案:

答案 0 :(得分:2)

您可以在.GetType()中的实例上使用MyList并从那里开始。

MyList[0].GetType()&gt;这与typeof(FirstImplementer)等人

相同

答案 1 :(得分: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
    }
}

通常最好使用isas进行反思(例如GetType),这样做可能会有意义。

答案 2 :(得分:0)

foreach (var instance in MyList)
{
    Type implementation = instance.GetType ();
}

答案 3 :(得分:0)

如果需要获取第一个类型的参数(如果有的话),并且如果列表中的每个实例都没有这样的类型参数,则返回null,这在设计时您在语法上观察为接口引用,那么您可以使用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];
    }
}