LINQ Lambdas中的继承与多态

时间:2012-06-29 11:19:52

标签: .net linq inheritance lambda .net-4.5

我有几个继承自基类的类

Public MustInherit Class BaseClass
    Public Property Name as String
End Class

Public MustInherit Class ClassA
    Inherits BaseClass
    Public Property Something As String
End Class

Public MustInherit Class ClassB
    Inherits BaseClass
    Public Property SomethingElse As String
End Class

我希望能够使用单个表达式来查询多个对象列表,所有对象都从相同的基类继承

Public Function DoStuff(Expression as System.Linq.Expressions.Expression(Of Func(Of BaseClass, Boolean)))
    Dim ListA As New List(Of ClassA) ''Populating this elsewhere
    Dim ListB As New List(Of ClassB) ''and this

    Dim ResultSetA = ListA.Where(Expression) ''Problems on this line
    Dim ResultSetB = ListA.Where(Expression) ''and this
End Function

由于ClassAClassB都继承自同一个基类,并且由于LINQ查询是针对基类的,因此应该工作。 Expression只能引用基类的属性,这些属性保证在两个派生类中都存在,但是我得到以下编译时输入错误:

Value of type 'System.Linq.Expressions.Expression(Of System.Func(Of BaseClass, Boolean))' cannot be converted to 'System.Linq.Expressions.Expression(Of System.Func(Of ClassA, Boolean))'

有什么方法可以添加扩展转换(或类似的东西)来实现这个功能吗?

或者我是否需要针对每个派生类多次提供完全相同的查询?

1 个答案:

答案 0 :(得分:3)

您需要AsQueryable()您的列表(下面的c#语法)

var ResultA = lista.AsQueryable().Where(expression);

如果需要,您可以将结果转换回原始类型

 foreach (var x in ResultA)
 {
      Response.Write(((ClassA)x).Something);
 }