围绕基类和派生类的混淆

时间:2013-04-14 10:08:50

标签: c#

基本情景是:

class MyBase {}
class MyClassA : MyBase {}
class MyClassB : MyBase {}
class MyClassC : MyBase {}

我有一个名为IEnumerable的{​​{1}} MyBase集合,其实际上包含sourceMyClassAMyClassB个项目的集合。总是只有一个或另一个。

我现在想要创建该集合的过滤副本,以便执行与此类似的操作:

MyClassC

问题是,如果我在源上调用GetType()方法,它会说它是MyClass(A,B或C)的集合。但是,对过滤器执行GetType()表示它是MyBase的集合!

我需要它保持不变!

这会导致我出现问题,因为我将过滤后的集合绑定到IEnumerable<MyBase> filtered = source.Where(s => s.SomeProperty == someVar) ,现在无法在过滤后的集合中看到它所需的PivotControl属性。

因为我们不知道集合中有哪个A,B或C类,所以我甚至试过这个:

MyClass

- 或 -

var entity = source.FirstOrDefault();    
IEnumerable<MyBase> filtered = FilterData(entity);

IEnumerable<MyBase> FilterData<T>(T typeOfObject) where T : MyBase
{
    IEnumerable<T> data = from s in source where s.SomeProperty == someVar select s as T;
    return data;

但它仍然以同样的方式显示。

由于

1 个答案:

答案 0 :(得分:1)

我对你的问题感到很困惑,但认为这是关于Cast扩展方法的全部内容:

IEnumerable<MyClass> filtered = source.Where(s => s.SomeProperty = someVar).Cast<MyClass>();