我们需要在运行时评估对象中的值,同时我们有一个确切成员路径的文本语句,例如:myobject.firstMember.secondMember [3] .text
我们考虑使用正则表达式解析这个文本语句,然后评估文本通过使用反射,但在我们这样做之前,我想知道C#是否支持某种评估能力?所以我们不必自己解析.微软如何在他们的直接窗口或观看窗口中执行此操作?
非常感谢你,
阿迪巴尔达
可能最简单的方法是使用System.Web.UI中的DataBinder.Eval:
var foo = new Foo() { Bar = new Bar() { Value = "Value" } }; var value = DataBinder.Eval(foo, "Bar.Value");
我编写了一个开源项目Dynamic Expresso,它可以将使用C#语法编写的文本表达式转换为委托(或表达式树).表达式被解析并转换为表达式树而不使用编译或反射.
你可以这样写:
var interpreter = new Interpreter(); var result = interpreter.Eval("8 / 2 + 2");
要么
var interpreter = new Interpreter() .SetVariable("service", new ServiceExample()); string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()"; Lambda parsedExpression = interpreter.Parse(expression, new Parameter("x", typeof(int))); parsedExpression.Invoke(5);
我的工作基于Scott Gu的文章http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.
在将来(大约5.0时间范围内),"编译器即服务"可能能够做到这一点.实际上,你现在可以用"mono"做很多事情(参见CsharpRepl和Mono.CSharp - 但是,我希望它能够更多地了解能够使用局部变量等的上下文.Evaluate
) - 但在当前的MS .NET产品中没有任何支持.
现在,你必须做一些类似于许多数据绑定代码所做的事情......将它分开,例如"."等标记.并使用反射.严格地说,绑定代码实际上使用TypeDescriptor
/ PropertyDescriptor
而不是直接反射,但效果是相同的.