如何为未选中的语句创建表达式树语句

本文关键字:语句 创建 表达式 | 更新日期: 2023-09-27 18:24:11

在我的表达式树(使用Expression类创建)中,我需要将代码包装在未检查的块中(http://msdn.microsoft.com/en-us/library/a569z7k8.aspx)但是怎么做呢?Expression类型没有什么有趣的地方。

如何为未选中的语句创建表达式树语句

Expression类型的每个运算符都有单独的版本,用于已检查和未检查的操作。要将表达式主体中的任何checked操作更改为unchecked操作,不能仅将整个操作包装在unchecked表达式中。您需要遍历整个表达式树,找到已检查操作的所有用法,并用这些操作的未检查版本替换它们。

public static Expression MakeUnchecked(this Expression expression)
{
    return new UncheckedExpressionVisitor().Visit(expression);
}
public class UncheckedExpressionVisitor : ExpressionVisitor
{
    protected override Expression VisitBinary(BinaryExpression node)
    {
        switch (node.NodeType)
        {
            case ExpressionType.AddAssignChecked:
                return base.Visit(Expression.AddAssign(node.Left, node.Right));
            case ExpressionType.AddChecked:
                return base.Visit(Expression.Add(node.Left, node.Right));
            case ExpressionType.MultiplyAssignChecked:
                return base.Visit(Expression.MultiplyAssign(node.Left, node.Right));
            case ExpressionType.MultiplyChecked:
                return base.Visit(Expression.Multiply(node.Left, node.Right));
            case ExpressionType.SubtractAssignChecked:
                return base.Visit(Expression.SubtractAssign(node.Left, node.Right));
            case ExpressionType.SubtractChecked:
                return base.Visit(Expression.Subtract(node.Left, node.Right));
            default:
                return base.VisitBinary(node);
        }
    }
    protected override Expression VisitUnary(UnaryExpression node)
    {
        switch (node.NodeType)
        {
            case ExpressionType.ConvertChecked:
                return base.Visit(Expression.Convert(node.Operand, node.Type));
            case ExpressionType.NegateChecked:
                return base.Visit(Expression.Negate(node.Operand, node.Method));
            default:
                return base.VisitUnary(node);
        }
    }
}