2009-10-01 28 views
2

我已經在一個單獨的C#項目重新創建Predicatebuilder類,我想在VB.NET項目中使用它,但我不斷收到以下錯誤:使用PredicateBuilder用VB.NET

Overload resolution failed because no accessible 'Or' accepts this number of arguments.

時我用它像這樣:

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

的relivant項目被引用,我使用的是正確的進口聲明,這一切編譯沒有任何錯誤。

任何想法,我要去哪裏錯了?

這是在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()); return 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()); return Expression.Lambda> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters); } }

+0

不知道你自己的API,它不可能給這個問題的答案。發佈代碼的C#版本,或將簽名發佈到PredicateBuilder.Or方法。 – Juliet 2009-10-01 22:26:31

回答

3

解決了這個問題。這是因爲Option Infer被設置爲Off。只要我將它設置爲On,正確的類型就會被傳遞,並且它一切都按照它應該的那樣工作。

+0

確保您將此設置爲接受的答案,因爲這是其他人知道的有用信息! – 2009-10-02 12:04:18

0

它爲我的作品:

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

(我沒有你的t_Quote型)

而且,有一個像t_Quote這樣的類型名稱是非常可怕的做法。那應該叫Quote;在C#名字中,匈牙利符號和下劃線都被忽視了。

+2

...以及VB.NET名稱。 – 2009-10-01 22:26:47

+0

我接受你對命名約定的評論(不是我的選擇!)。 t_Quote類型是一個linq to sql類,該信息是否有助於解決此問題? – rollercoast 2009-10-01 22:40:26

+0

不是我能想到 – SLaks 2009-10-01 22:54:02

7

下面是我在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) 
+0

我試過這個VB.NET版本,並得到了同樣的錯誤。 – rollercoast 2009-10-01 23:57:51

1

有一點需要牢記,儘管它可能無法解決您的特定問題,但在使用跨語言解決方案時區分大小寫。

C#和CLR本身區分大小寫; VB.NET不是。根據您使用庫的方式,可能會拋出異常,因爲案例不匹配(因此無法解析爲已知類型)。

,如果你認爲你一貫宣稱的命名空間名稱會發生​​這種情況,但一類與以大寫一個字符聲明的名稱空間。這在Visual Basic中很容易實現,但對於VB.NET來說,它們看起來都像是編譯成了一個緊密的名稱空間。就CLR而言,它們是兩個不同的名稱空間。

我遇到過這個問題之前,它是一個難以捉摸的錯誤追蹤。

我知道你正在使用VB.NET的C#項目,但請留意這些類型的問題。