Tag: 表达式

如何将表达式树编译成可调用的方法C#?

我有一个表达式树,我通过使用C#中的表达式类解析Xml来创建。 看到这个问题 。 我只在我的表达式树中添加,减去,除以,乘,参数和和。 有没有办法将此ExpressionTree转换为可调用方法? …还是我必须手动发射IL? 亲切的问候,

reflection性能 – 创建代理(属性C#)

我在使用reflection时遇到了性能问题。 所以我决定为我的对象的属性创建委托,到目前为止得到了这个: TestClass cwp = new TestClass(); var propertyInt = typeof(TestClass).GetProperties().Single(obj => obj.Name == “AnyValue”); var access = BuildGetAccessor(propertyInt.GetGetMethod()); var result = access(cwp); static Func BuildGetAccessor(MethodInfo method) { var obj = Expression.Parameter(typeof(object), “o”); Expression<Func> expr = Expression.Lambda<Func>( Expression.Convert( Expression.Call( Expression.Convert(obj, method.DeclaringType), method), typeof(object)), obj); return expr.Compile(); } 结果非常令人满意,比使用传统方法快3-40-40倍( PropertyInfo.GetValue (obj, null); ) 问题是: 如何制作属性的SetValue ,其工作方式相同? […]

Shunting-Yardvalidation表达式

我们使用Shunting-Yard算法来计算表达式。 我们可以通过简单地应用算法来validation表达式。 如果缺少操作数,错过匹配的括号和其他内容,它将失败。 然而,Shunting-Yard算法具有比人类可读中缀更大的支持语法。 例如, 1 + 2 + 1 2 1 2 + 是提供“1 + 2”作为Shunting-Yard算法输入的可接受方法。 ‘+ 1 2’和’1 2 +’不是有效的中缀,但标准的Shunting-Yard算法可以处理它们。 该算法并不真正关心顺序,它通过优先顺序抓取“最近”的操作数来应用运算符。 我们希望将输入限制为有效的人类可读中缀。 我正在寻找一种方法来修改Shunting-Yard算法以使用无效的中缀失败,或者在使用Shunting-Yard之前提供中缀validation。 有人知道任何已发表的技术吗? 我们必须支持基本运算符,自定义运算符,括号和函数(带有多个参数)。 我没有看到任何与在线基本操作员相关的东西。 谢谢