Car*_*ngo 1 c# code-generation
在我的表达式树(使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |