将Interface和IQueryable <interface>转换为其具体实现

时间:2016-06-22 13:40:48

标签: c# .net interface casting

我有Class B,C和D继承自接口IA。现在我已经IQueryable<B>IQueryable<C>IQueryable<D>需要一种方法来处理IA中某些属性的内容。

public IQueryable<T> DoStuff<T>(IQueryable<IA> samples) where T: IA{
    // something that filters samples. Ommited

    return samples.Select(s => (T)s).AsQueryable(); // works
    //return (IQueryable<T>)samples; //InvalidCastException
}

var samples; // samples can be IQueryable<B>, IQueryable<C>, or IQueryable<D>
samples = DoStuff(samples); 

两个问题:

  1. 为什么没有使用IQueryable<T>进行投射?它在循环和逐个投射时确实投射了。
  2. 最初,B,C和D继承自班级A。那是行不通的,因为我无法将一个班级从A转为B,C,D。然后我将A改为IA。但是,我读过一些人说,当你需要为其具体实现抛弃一个接口时,你就会遇到设计问题。我需要避免在这里丢弃吗?如果是这样,那么实现目标的好方法是什么?

0 个答案:

没有答案