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

本文关键字:实例 实现者 获取 接口 | 更新日期: 2023-09-27 18:07:31

我有一些实现接口的类:

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

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

List<IInterface> MyList;

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

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

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

MyList[0].GetType()>与typeof(FirstImplementer)等相同

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),当这样做可能有意义时

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

如果您需要获得第一个类型参数(如果有的话),如果不存在这样的类型参数(在设计时语法上观察为接口引用),则为null,那么您可以使用type类型的GetGenericArguments方法。

这是一个小的辅助方法,它接受一堆对象它们可能是空的,但如果它们不是空的,它们肯定会实现你的接口(他们会有一个运行时类型),并产生一堆类型在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];
    }
}