gpt4 book ai didi

c# - 将条件表达式解析为字符串

转载 作者:太空狗 更新时间:2023-10-29 23:03:42 24 4
gpt4 key购买 nike

我正在寻找一种将条件表达式解析为字符串的方法。

我能想到的最好的例子是 LINQ-to-SQL。它使用 ExpressionVisitors 来格式化“Where”子句。示例:

from a in b where a.x == 5 && a.y < 3 select a

这将转换为以下字符串(大约,MSSQL 对我来说不是最新的):

"SELECT * FROM b WHERE x = 5 AND y < 3"

据我所知,这是使用 ExpressionVisitor 类完成的,如本文所述:Link

现在的问题是我不使用 LINQ,但我需要这个特定的功能。有没有办法解析这样的条件?我愿意用反射、委托(delegate)、lambda 等做任何事情。

老实说,我不认为这是可能的,但我的大脑有点炸了(阅读:如果这个问题很荒谬,请保持友善),所以我想我还是给 S/试试看。

编辑:最终用法示例:

// Usage:
foo.Bar(foo => foo.X == 5 && foo.Y < 3)

// Ideal string output (variable name (foo) is not needed):
"foo.X == 5 && foo.Y < 3"

编辑 2:是的,数字可以小于 3 等于 5。告诉过你我的脑子炸了。

最佳答案

如果它是关于构建表达式树本身,那么您可以利用 C# 编译器功能。

将 lambda 表达式传递给接受表达式的函数是合法的>,只要 Func 的类型参数是已知的。例如

 private static void PrintExpression(Expression<Func<int, bool>> lambda)
{
Console.WriteLine(lambda.ToString());
}

可以称为

 PrintExpression(a=> a > 0 && a < 5);

你可以用泛型即兴创作

private static void PrintExpression<T1,T2>(Expression<Func<T1, T2>> lambda)
{
Console.WriteLine(lambda.ToString());
}

并用

调用它
   PrintExpression<int, bool>(a=> a > 0 && a < 5);

对于表达式部分的自定义打印,您可以编写一个简单的递归函数来打印表达式或任何其他适合您的逻辑。

请记住,lambda 表达式在编译时被编译成表达式 - 因此不能用已编译的 Func 替换它。

作为替代方案,您始终可以构建自定义查询提供程序,但这会稍微偏离目的 - 因为您需要将其绑定(bind)某种可查询(再次自定义)。

关于c# - 将条件表达式解析为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com