-->

使用PredicateBuilder用VB.NET(Using PredicateBuilder w

2019-07-20 12:22发布

我曾经在一个单独的C#项目重新创建Predicatebuilder类,我想在VB.NET工程使用它,但我不断收到以下错误:

重载决策失败,因为没有可访问“或”接受此数目的参数。

当我使用它,像这样:

Dim predicate = PredicateBuilder.False(Of t_Quote)()
predicate = predicate.Or(Function(q) q.iQuoteType = iQuoteType)

该项目relivant引用,我使用的是正确的进口声明,这一切编译没有任何错误。

任何想法,我要去哪里错了吗?

这里是我使用C#的PredicateBuilder类:

公共静态类PredicateBuilder {公共静态表达式>真(){返回F =>真; }公共静态表达式>假(){返回F =>假; }

  public static Expression<Func<T, bool>> Or<T>(this 

表达式>表达式1,表达式>表达式2){风险invokedExpr = Expression.Invoke(表达式2,expr1.Parameters.Cast()); 返回Expression.Lambda>(Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters); }

  public static Expression<Func<T, bool>> And<T>(this 

表达式>表达式1,表达式>表达式2){风险invokedExpr = Expression.Invoke(表达式2,expr1.Parameters.Cast()); 返回Expression.Lambda>(Expression.AndAlso(expr1.Body,invokedExpr),expr1.Parameters); }}

Answer 1:

下面是我在VB.NET,这工程,我还调整了这个类VB.NET中运行代码...

Imports System.Linq.Expressions

Public Module PredicateBuilder
    Public Function [True](Of T)() As Expression(Of Func(Of T, Boolean))
        Return Function(f) True
    End Function

    Public Function [False](Of T)() As Expression(Of Func(Of T, Boolean))
        Return Function(f) False
    End Function

    <System.Runtime.CompilerServices.Extension()> _
    Public Function [Or](Of T)(ByVal expr1 As Expression(Of Func(Of T, Boolean)), ByVal expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
        Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
        Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[Or](expr1.Body, invokedExpr), expr1.Parameters)
    End Function

    <System.Runtime.CompilerServices.Extension()> _
    Public Function [And](Of T)(ByVal expr1 As Expression(Of Func(Of T, Boolean)), ByVal expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
        Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
        Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[And](expr1.Body, invokedExpr), expr1.Parameters)
    End Function
End Module

这里是我如何使用它:

Dim pred = PredicateBuilder.True(Of MyClass)()

pred = pred.And(Function(m As MyClass) m.SomeProperty = someValue)
pred = pred.Or(Function(m As MyClass) m.SomeProperty = someValue)


Answer 2:

解决了这个问题。 这是因为选项推断设置为OFF。 当我将其设置为在正确的类型是infered和它的所有工作,因为它应该。



Answer 3:

有一点要记住,虽然它可能不是解决您的具体问题,是区分大小写与跨语言解决方案工作时。

C#和CLR本身是大小写敏感的; VB.NET是没有的。 根据哪种方式你就吃下了图书馆,可能会引发异常,因为情况不匹配(因此无法解析到一个已知的类型)。

如果你认为你一贯宣称的命名空间名称会发生这种情况,但一类与以大写字母一个字符声明的名称空间。 这是很容易在Visual Basic中的事,但到VB.NET,他们看起来都像他们已经编译成一个单一的,有凝聚力的命名空间。 至于CLR是,虽然而言,它们是两个不同的命名空间。

我以前也碰到这个问题,这是一个非常难以捉摸的错误追查。

我知道你就吃下从VB.NET C#项目,但随时留意这些类型的问题。



Answer 4:

这个对我有用:

Dim predicate = PredicateBuilder.False(Of Integer)()
predicate = predicate.Or(Function(q) q Mod 2 = 0)

(我没有你的t_Quote型)

此外,这是可怕的做法,对类型名称,比如t_Quote 。 这应该被称为Quote ; 匈牙利命名法和下划线都在C#中的名称皱起了眉头。



文章来源: Using PredicateBuilder with VB.NET