2013-04-04 103 views
0

获取实施者类的实例,我有一些类实现一个接口:从接口实例

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

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

List<IInterface> MyList; 

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

回答

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

+0

它比这更深入一点。在特定情况下,实现者是'Implementer ',并且接口用于省略类型参数,因此我可以遍历许多不同类型的实例。在这一点上,我想从列表中的每一个获取类型参数并打印它们。 – 2013-04-04 20:23:59

+0

@Daniel我用另一种方法更新了我的解决方案。如果你不需要反思,你应该避免它。 – 2013-04-05 00:15:38

2

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

MyList[0].GetType()>这与typeof(FirstImplementer)等人的相同。

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

如果你需要得到的第一个类型参数,如果有的话,空,如果没有这种类型的参数,甚至存在在你的列表中的每个实例,它在设计时,你语法观察的接口引用,那么你可以使用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]; 
    } 
}