当前位置:  开发笔记 > 编程语言 > 正文

C#Eval()支持

如何解决《C#Eval()支持》经验,为你挑选了3个好方法。

我们需要在运行时评估对象中的值,同时我们有一个确切成员路径的文本语句,例如:myobject.firstMember.secondMember [3] .text
我们考虑使用正则表达式解析这个文本语句,然后评估文本通过使用反射,但在我们这样做之前,我想知道C#是否支持某种评估能力?所以我们不必自己解析.微软如何在他们的直接窗口或观看窗口中执行此操作?

非常感谢你,

阿迪巴尔达



1> Alex Yakunin..:

可能最简单的方法是使用System.Web.UI中的DataBinder.Eval:

var foo = new Foo() { Bar = new Bar() { Value = "Value" } };
var value = DataBinder.Eval(foo, "Bar.Value");



2> Davide Icard..:

我编写了一个开源项目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.



3> Marc Gravell..:

在将来(大约5.0时间范围内),"编译器即服务"可能能够做到这一点.实际上,你现在可以用"mono"做很多事情(参见CsharpRepl和Mono.CSharp - 但是,我希望它能够更多地了解能够使用局部变量等的上下文.Evaluate) - 但在当前的MS .NET产品中没有任何支持.

现在,你必须做一些类似于许多数据绑定代码所做的事情......将它分开,例如"."等标记.并使用反射.严格地说,绑定代码实际上使用TypeDescriptor/ PropertyDescriptor而不是直接反射,但效果是相同的.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有