2009-06-26 111 views
0

我有一個接口列表,其中存儲從該接口派生的各種對象。我想寫一個函數,調用者指定要提取的類型。我已經試過這樣:從基本元素列表中提取派生元素

List<IParts> PartList; 

...

public List<IPart> Fetch(Type PartType) 
{ 
    return this.PartList.OfType<PartType>().Cast<IPart>().ToList(); 
} 

但它不喜歡通過型式。有什麼建議麼?

回答

2

如果你在運行時(而不是在編譯時與仿製藥),以支持各種類型:

public List<IPart> Fetch(Type PartType) 
{ 
    if (!typeof(IPart).IsAssignableFrom(PartType)) 
    { 
     throw new ArgumentOutOfRangeException("PartType", "Must derive from IPart"); 
    } 
    return this.PartList.Where(i => i != null && PartType.IsAssignableFrom(i.GetType())).ToList(); 
} 
2

指定它作爲一個類型參數,而不是:

public List<IPart> Fetch<T>() where T : IPart 
{ 
    return this.PartList.OfType<T>().Cast<IPart>().ToList(); 
} 

你會這樣稱呼它:

List<IPart> foo = parts.Fetch<Exhaust>(); 

,如果你知道在編譯時的部分類型這很好。如果不這樣做,則需要使用反射來基本獲取Enumerable<T>中的OfType()方法,並從中創建寫入通用方法。喜歡的東西:

private static readonly MethodInfo OfTypeMethod = 
    typeof(Enumerable).GetMethod("OfType"); 

public List<IPart> Fetch(Type partType) 
{ 
    MethodInfo method = OfTypeMethod.MakeGenericMethod(partType); 
    IEnumerable enumerable = (IEnumerable) method.Invoke 
     (null, new object[] { PartList }); 
    return enumerable.Cast<IPart>().ToList(); 
} 
+0

您可以添加一個「where T:IPART」一般的限制,即會使它成爲你沒有得到無效的轉換和邏輯錯誤 – 2009-06-26 06:25:34

+0

哦,好 - 會做。 – 2009-06-26 06:28:07