2009-06-26 81 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