簡體   English   中英

在VB.NET中使用PredicateBuilder

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM