[英]Using PredicateBuilder with VB.NET
我在一個單獨的C#項目中重新創建了Predicatebuilder類,我試圖在VB.NET項目中使用它但是我一直收到以下錯誤:
重載決策失敗,因為沒有可訪問的“或”接受此數量的參數。
當我像這樣使用它時:
Dim predicate = PredicateBuilder.False(Of t_Quote)()
predicate = predicate.Or(Function(q) q.iQuoteType = iQuoteType)
引用了relivant項目,我正在使用正確的import語句,它都編譯沒有任何錯誤。
知道我哪里錯了嗎?
這是我正在使用的C#中的PredicateBuilder類:
public static class PredicateBuilder {public static Expression> True(){return f => true; public static Expression> False(){return f => false; }
public static Expression<Func<T, bool>> Or<T>(this
Expression> expr1,Expression> expr2){var invokedExpr = Expression.Invoke(expr2,expr1.Parameters.Cast()); 返回Expression.Lambda>(Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters); }
public static Expression<Func<T, bool>> And<T>(this
Expression> expr1,Expression> expr2){var invokedExpr = Expression.Invoke(expr2,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)
解決了這個問題。 這是因為Option Infer設置為Off。 一旦我將它設置為On,就會輸入正確的類型,並且它都能正常工作。
在使用跨語言解決方案時,要記住的一件事雖然可能無法解決您的特定問題,但卻是區分大小寫的。
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#名稱中都不受歡迎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.