gpt4 book ai didi

javascript - 是否可以解释 C# 表达式树以发出 JavaScript?

转载 作者:IT王子 更新时间:2023-10-29 04:16:30 27 4
gpt4 key购买 nike

例如,如果您有这样的表达式:

Expression<Func<int, int>> fn = x => x * x;

是否有任何东西可以遍历表达式树并生成它?

"function(x) { return x * x; }"

最佳答案

这可能并不容易,但是是的,它绝对可行。 Entity Framework 或 Linq to SQL 等 ORM 将 Linq 查询转换为 SQL,但实际上您可以从表达式树中生成任何您想要的...

你应该实现一个 ExpressionVisitor对表达式进行分析和转换。


编辑:这是适用于您的示例的非常基本的实现:

Expression<Func<int, int>> fn = x => x * x;
var visitor = new JsExpressionVisitor();
visitor.Visit(fn);
Console.WriteLine(visitor.JavaScriptCode);

...

class JsExpressionVisitor : ExpressionVisitor
{
private readonly StringBuilder _builder;

public JsExpressionVisitor()
{
_builder = new StringBuilder();
}

public string JavaScriptCode
{
get { return _builder.ToString(); }
}

public override Expression Visit(Expression node)
{
_builder.Clear();
return base.Visit(node);
}

protected override Expression VisitParameter(ParameterExpression node)
{
_builder.Append(node.Name);
base.VisitParameter(node);
return node;
}

protected override Expression VisitBinary(BinaryExpression node)
{
base.Visit(node.Left);
_builder.Append(GetOperator(node.NodeType));
base.Visit(node.Right);
return node;
}

protected override Expression VisitLambda<T>(Expression<T> node)
{
_builder.Append("function(");
for (int i = 0; i < node.Parameters.Count; i++)
{
if (i > 0)
_builder.Append(", ");
_builder.Append(node.Parameters[i].Name);
}
_builder.Append(") {");
if (node.Body.Type != typeof(void))
{
_builder.Append("return ");
}
base.Visit(node.Body);
_builder.Append("; }");
return node;
}

private static string GetOperator(ExpressionType nodeType)
{
switch (nodeType)
{
case ExpressionType.Add:
return " + ";
case ExpressionType.Multiply:
return " * ";
case ExpressionType.Subtract:
return " - ";
case ExpressionType.Divide:
return " / ";
case ExpressionType.Assign:
return " = ";
case ExpressionType.Equal:
return " == ";
case ExpressionType.NotEqual:
return " != ";

// TODO: Add other operators...
}
throw new NotImplementedException("Operator not implemented");
}
}

它只能用一条指令处理 lambda,但无论如何 C# 编译器无法为 block lambda 生成表达式树。

当然还有很多工作要做,这是一个非常简单的实现...您可能需要添加方法调用 (VisitMethodCall)、属性和字段访问 (VisitMember ), 等等

关于javascript - 是否可以解释 C# 表达式树以发出 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5999228/

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