- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在执行之前使用 ExpressionVisitor 来分析表达式。根据我的需要,我需要评估 Divide 表达式的正确部分,但我不知道该怎么做。这是我拥有的示例代码:
internal class RulesChecker : ExpressionVisitor
{
private readonly object data;
public RulesChecker(object data)
{
this.data = data;
}
protected override Expression VisitBinary(BinaryExpression node)
{
if (node.NodeType == ExpressionType.Divide)
{
var rightExpression = node.Right;
// compile the right expression and get his value
}
return base.VisitBinary(node);
}
}
Expression<Func<DataInfo, decimal?>> expression = x => x.A / (x.B + x.C);
var rulesChecker = new RulesChecker(data);
rulesChecker.Visit(expression);
最佳答案
我认为这个问题最难的部分是处理变量。所以我会从替换常量的变量开始。之后,您只需要执行和更新表达式。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace WindowsFormsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
var value1 = 1;
var value2 = 2;
var value3 = new { MyValue = 3 };
var data = new DataInfo { A = 10, B = 1, C = -1 };
Expression<Func<DataInfo, decimal?>> expression = x => x.A / (x.B + x.C) + (value1 + value2) + value3.MyValue;
// create a list of variables that will be used when evaluating the expression
var variables = new Dictionary<Type, object>();
// add the root object
variables.Add(data.GetType(), data);
// find variables that are referenced in the expression
var finder = new VariablesFinder(variables);
finder.Visit(expression);
// replace variables with ConstantExpressions
var visitor = new VariableReplacer(variables);
var newExpression = visitor.Visit(expression);
var rulesChecker = new RulesChecker();
var checkedExpression = rulesChecker.Visit(newExpression);
}
}
internal class RulesChecker : ExpressionVisitor
{
protected override Expression VisitBinary(BinaryExpression node)
{
if (node.NodeType == ExpressionType.Divide)
{
var rightBinaryExpression = node.Right as BinaryExpression;
if (rightBinaryExpression != null)
{
node = node.Update(node.Left, node.Conversion, this.Execute(rightBinaryExpression));
}
}
return base.VisitBinary(node);
}
private Expression Execute(BinaryExpression node)
{
var lambda = Expression.Lambda(node);
dynamic func = lambda.Compile();
var result = func();
return Expression.Constant(result, result.GetType());
}
}
internal class VariableReplacer : ExpressionVisitor
{
private readonly Dictionary<Type, object> _variables;
public VariableReplacer(Dictionary<Type, object> variables)
{
this._variables = variables;
}
protected override Expression VisitMember(MemberExpression node)
{
return this.HandleProperty(node) ??
this.HandleField(node) ??
node;
}
private Expression HandleField(MemberExpression memberExpression)
{
var fieldInfo = memberExpression.Member as FieldInfo;
if (fieldInfo != null)
{
var value = fieldInfo.GetValue(this.GetVarialbe(fieldInfo));
return Expression.Constant(value, fieldInfo.FieldType);
}
return null;
}
private Expression HandleProperty(MemberExpression memberExpression)
{
var propertyInfo = memberExpression.Member as PropertyInfo;
if (propertyInfo != null)
{
var value = propertyInfo.GetValue(this.GetVarialbe(propertyInfo), null);
return Expression.Constant(value, propertyInfo.PropertyType);
}
return null;
}
private object GetVarialbe(MemberInfo memberInfo)
{
return this._variables[memberInfo.DeclaringType];
}
}
internal class VariablesFinder : ExpressionVisitor
{
private readonly Dictionary<Type, object> _variables;
public VariablesFinder(Dictionary<Type, object> variables)
{
this._variables = variables;
}
protected override Expression VisitConstant(ConstantExpression node)
{
this.AddVariable(node.Type, node.Value);
return base.VisitConstant(node);
}
private void AddVariable(Type type, object value)
{
if (type.IsPrimitive)
{
return;
}
if (this._variables.Keys.Contains(type))
{
return;
}
this._variables.Add(type, value);
var fields = type.GetFields().Where(x => !x.FieldType.IsPrimitive).ToList();
foreach (var field in fields)
{
this.AddVariable(field.FieldType, field.GetValue(value));
}
}
}
class DataInfo
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
public int D;
}
}
关于c# - 如何评估 ExpressionVisitor 中的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764662/
我从 MSDN 上关于 How to: Modify Expression Trees 的文章中得知ExpressionVisitor 应该做什么。它应该修改表达式。 然而,他们的示例非常不切实际,所
我需要在执行之前使用 ExpressionVisitor 来分析表达式。根据我的需要,我需要评估 Divide 表达式的正确部分,但我不知道该怎么做。这是我拥有的示例代码: internal clas
如何使用 olingo4 将原始表达式传递给 Odata4 的 ExpressionVisitor 实现。这就是在 olingo2 JDBC Visitor Filter 中完成的方法 String
我正在尝试在我的 Entity Framework 模型中添加对多语言分类字符串的支持。这是我的: 实体: public partial class ServiceState : ITranslata
我正在关注 example series on MSDN用于创建 LINQ 提供程序并碰壁了。 我希望当我编写以下测试时 ExpressionVisitor下面源代码中的子类是 VisitMethod
我正在关注 this blog尝试为我目前正在处理的项目创建适用于 MSAccess 的 IQueryable 提供程序。 我得到了上面链接的页面,但是有几段代码创建了继承自 ExpressionVi
我正在使用 ExpressionVisitor 解析表达式树以查明它是否包含指定参数。找到参数后,继续遍历就没有意义了。 有什么方法可以停止一般访问者模式的遍历,更具体地说是.NET 中Express
我有一个在数据库中实现软删除的框架(称为 DeletedDate 的可空日期时间)。我正在使用存储库来处理主要实体请求,如下所示: /// /// Returns a Linq Queryable
我正在尝试使用定义明确的模型为定义明确的 Web API 构建 LINQ 提供程序。我正在关注这些演练: Part I Part II 我已经能够创建将表达式转换为所需 URL 的查询提供程序,并且效
我必须为一项任务设计一个解决方案,我想使用理论上类似于 C# 的 ExpressionVisitor 的东西。 出于好奇,我打开了 ExpressionVisitor 的 .NET 源代码来查看它。从
在有人喊出答案之前,请通读问题。 .NET 4.0 的 ExpressionVisitor 方法的目的是什么: public static ReadOnlyCollection Visit(ReadO
我在 Eclipse 中从实体创建表时遇到一些麻烦。这个项目最初是在 Windows 上的 Eclipse 上,我从 mysql 表创建了实体并将其导入到项目中。一切都运转良好。昨天我决定从 Wind
我正在尝试按照 Creating an IQueryable LINQ Provider 上的说明进行操作,但是当我实现从 ExpressionVisitor 继承的类时按照指示,我被告知 Expre
我有一个问题,像这样: var query = from sessions in dataSet where (names.Contains(sessions.
我有一个 ExpressionVisitor我将其添加到 EF Core 的 IQueryable .除 Include 方法外,一切正常。可能是因为他们强制执行您的 IQueryable.Provi
我正在为我们系统的一部分编写数据层,该部分记录有关每天运行的自动化作业的信息 - 作业名称、运行时长、结果等。 我正在使用 Entity Framework 与数据库对话,但我试图对更高级别的模块隐藏
我正在使用 Olingo 框架以 Java 语言实现符合 OData 标准第 4 版的 Web 服务。我需要自定义 $filter 的响应。我已经实现了一个访客 as documented in th
System.Linq.Expressions.ExpressionVisitor 有一个名为 VisitExtension 的方法,它似乎除了在表达式被访问。 protected internal
我是一名优秀的程序员,十分优秀!