我在一个单独的C#项目中重新创建了Predicatebuilder类,我试图在VB.NET项目中使用它但是我一直收到以下错误:
重载解析失败,因为没有可访问的'或'接受此数量的参数。
当我像这样使用它时:
Dim predicate = PredicateBuilder.False(Of t_Quote)()
predicate = predicate.Or(Function(q) q.iQuoteType = iQuoteType)
引用了relivant项目,我正在使用正确的import语句,并且它都编译没有任何错误。
知道我哪里出错了?
这是我正在使用的C#中的PredicateBuilder类:
公共静态类PredicateBuilder { public static Expression>真(){ return f =>真正; } public static Expression>假(){ return f =>假; }
public static Expression<Func<T, bool>> Or<T>(this
表达式&GT;表达式1, 表达&GT;表达式2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast()); 返回Expression.Lambda&gt; (Expression.OrElse(expr1.Body, invokedExpr),expr1.Parameters); }
public static Expression<Func<T, bool>> And<T>(this
表达式&GT;表达式1, 表达&GT;表达式2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast()); 返回Expression.Lambda&gt; (Expression.AndAlso(expr1.Body, invokedExpr),expr1.Parameters); } }
答案 0 :(得分:9)
这是在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)
答案 1 :(得分:3)
解决了这个问题。这是因为Option Infer设置为Off。一旦我将它设置为On,就会输入正确的类型,并且它都能正常工作。
答案 2 :(得分:1)
在使用跨语言解决方案时,要记住的一件事情虽然可能无法解决您的特定问题,但却是区分大小写的。
C#和CLR本身区分大小写; VB.NET不是。根据您使用库的方式,可能会抛出异常,因为大小写不匹配(因此无法解析为已知类型)。
如果您认为自己一直声明了命名空间名称,但是一个类的名称空间用一个字符声明,则会发生这种情况。这在Visual Basic中很容易实现,但对于VB.NET,它们看起来都像是编译成一个单一的,有凝聚力的命名空间。就CLR而言,它们是两个不同的命名空间。
之前我遇到过这个问题,这是一个非常难以捉摸的错误。
我知道您正在使用VB.NET中的C#项目,但要留意这些类型的问题。
答案 3 :(得分:0)
它对我有用:
Dim predicate = PredicateBuilder.False(Of Integer)()
predicate = predicate.Or(Function(q) q Mod 2 = 0)
(我没有t_Quote
类型)
此外,拥有类似t_Quote
的类型名称是一种可怕的做法。这应该被称为Quote
;在C#名称中,匈牙利符号和下划线都不受欢迎。