我有一些实现接口的类:
class FirstImplementer : IInterface { ... }
class AnotherImplementer : IInterface { ... }
在代码的某处,我得到了 IInterface 实例的列表。
List<IInterface> MyList;
我想知道每个 IInterface 实例的具体实例的实现类是什么(FirstImplementer 或 AnotherImplementer)。
我有一些实现接口的类:
class FirstImplementer : IInterface { ... }
class AnotherImplementer : IInterface { ... }
在代码的某处,我得到了 IInterface 实例的列表。
List<IInterface> MyList;
我想知道每个 IInterface 实例的具体实例的实现类是什么(FirstImplementer 或 AnotherImplementer)。
您可以.GetType()
在其中的实例上使用MyList
并从那里开始。
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
}
}
在可能有意义的情况下,通常最好使用is
或as
过度反射(例如)。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];
}
}