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
    }
}

在可能有意义的情况下,通常最好使用isas过度反射(例如)。GetType

于 2013-04-04T20:19:16.813 回答
0
foreach (var instance in MyList)
{
    Type implementation = instance.GetType ();
}
于 2013-04-04T20:20:44.080 回答
0

如果您需要获取第一个类型参数(如果有),如果列表中的每个实例甚至不存在此类类型参数,则为 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];
    }
}
于 2013-04-04T20:40:20.340 回答