我曾经在一个单独的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); }}
下面是我在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)
解决了这个问题。 这是因为选项推断设置为OFF。 当我将其设置为在正确的类型是infered和它的所有工作,因为它应该。
有一点要记住,虽然它可能不是解决您的具体问题,是区分大小写与跨语言解决方案工作时。
C#和CLR本身是大小写敏感的; VB.NET是没有的。 根据哪种方式你就吃下了图书馆,可能会引发异常,因为情况不匹配(因此无法解析到一个已知的类型)。
如果你认为你一贯宣称的命名空间名称会发生这种情况,但一类与以大写字母一个字符声明的名称空间。 这是很容易在Visual Basic中的事,但到VB.NET,他们看起来都像他们已经编译成一个单一的,有凝聚力的命名空间。 至于CLR是,虽然而言,它们是两个不同的命名空间。
我以前也碰到这个问题,这是一个非常难以捉摸的错误追查。
我知道你就吃下从VB.NET C#项目,但随时留意这些类型的问题。
这个对我有用:
Dim predicate = PredicateBuilder.False(Of Integer)()
predicate = predicate.Or(Function(q) q Mod 2 = 0)
(我没有你的t_Quote
型)
此外,这是可怕的做法,对类型名称,比如t_Quote
。 这应该被称为Quote
; 匈牙利命名法和下划线都在C#中的名称皱起了眉头。