2013-04-04 133 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]; 
    } 
}