2

我在一个单独的 C# 项目中重新创建了 Predicatebuilder 类,我试图在 VB.NET 项目中使用它,但我不断收到以下错误:

重载解析失败,因为没有可访问的“或”接受此数量的参数。

当我像这样使用它时:

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

引用了 relivant 项目,我使用了正确的导入语句,它全部编译没有任何错误。

知道我哪里出错了吗?

这是我正在使用的 C# 中的 PredicateBuilder 类:

公共静态类 PredicateBuilder { public static Expression> True() { return f => true; } 公共静态表达式> False() { return f => false; }

    public static Expression<Func<T, bool>> Or<T>(this

表达式> expr1, 表达式> 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

表达式> expr1, 表达式> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast()); return Expression.Lambda> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters); } }

4

4 回答 4

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)
于 2009-10-01T22:38:23.060 回答
3

解决了这个问题。这是因为 Option Infer 设置为 Off。一旦我将其设置为 On,就会推断出正确的类型,并且一切正常。

于 2009-10-02T08:41:47.020 回答
1

尽管它可能无法解决您的特定问题,但要记住的一件事是使用跨语言解决方案时区分大小写。

C# 和 CLR 本身是区分大小写的;VB.NET 不是。根据您使用库的方式,可能会因为大小写不匹配而引发异常(因此无法解析为已知类型)。

如果您认为您一直在声明您的命名空间名称,但一个类的命名空间使用一个大写字符声明,则可能会发生这种情况。这在 Visual Basic 中很容易做到,但在 VB.NET 中,它们看起来都被编译成一个单一的、有凝聚力的命名空间。不过,就 CLR 而言,它们是两个不同的名称空间。

我以前遇到过这个问题,这是一个非常难以追踪的错误。

我知道您正在使用来自 VB.NET 的 C# 项目,但请留意这些类型的问题。

于 2009-10-02T01:47:04.660 回答
0

这个对我有用:

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

(我没有你的t_Quote类型)

此外,拥有像t_Quote. 那应该叫Quote;C# 名称中不赞成使用匈牙利符号和下划线。

于 2009-10-01T22:16:50.823 回答