这个问题已经在这里有一个答案:
- 如何评估C#代码动态? 16个回答
我们需要在运行时的目的是评估价值的同时,我们有例如确切的成员路径的文字声明:myobject.firstMember.secondMember [3]的.text
我们认为使用正则表达式解析该文本语句,然后通过使用反射评价文本值,但我们这样做之前我不知道C#支持某种EVAL能力? 所以我们不会有这样做的解析我们自己。 如何微软这样做是他们的直接窗口或监视窗口?
非常感谢你,
在阿迪酒吧
这个问题已经在这里有一个答案:
我们需要在运行时的目的是评估价值的同时,我们有例如确切的成员路径的文字声明:myobject.firstMember.secondMember [3]的.text
我们认为使用正则表达式解析该文本语句,然后通过使用反射评价文本值,但我们这样做之前我不知道C#支持某种EVAL能力? 所以我们不会有这样做的解析我们自己。 如何微软这样做是他们的直接窗口或监视窗口?
非常感谢你,
在阿迪酒吧
也许最简单的方法是使用的DataBinder.Eval从System.Web.UI程序:
var foo = new Foo() { Bar = new Bar() { Value = "Value" } };
var value = DataBinder.Eval(foo, "Bar.Value");
我已经写了一个开源项目, 动态快报 ,可以转换使用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);
我的工作是基于斯科特谷的文章http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx 。
将来(大约5.0阶段),将“编译器即服务”可能能够做到这一点。 其实,你可以做很多的这个现在“单”(见CsharpRepl和Mono.CSharp -不过,我希望它需要知道更多了很多关于上下文可以使用局部变量等,在Evaluate
) -但不是在当前MS .NET提供这方面的任何支持。
现在,你就必须这样做正是很多数据绑定代码并通过...令牌如开拆呢“” 和使用反射。 严格地说,绑定代码实际使用TypeDescriptor
/ PropertyDescriptor
,而不是直接反映,但效果是一样的。
虽然有些重量级的方法,你可以使用C#的CodeDOM发出包含与刚刚那行代码的方法一个新的一个新的装配。
这是更为严厉的比其他的一些建议,我承认,但在另一方面,你让C#解析器做繁重,所以它应该能够处理你吧,只要抛开一切,因为它是有效的C# 。
如果你走这条路线,你还需要确保你可以卸载再次组件发射,所以创建和卸载应用程序域是必要的。
我已经成功地实现和使用上述技术。 在另一方面,如果你可以使用一个DynamicMethod的它会更加轻量。 但是,我从来没有尝试过这种做法,所以我不能说是否可以使用C#文字实现DynamicMethod的身体。
其实,Windows工作流基础的表达评估和规则引擎功能可以做这样的事情。 见介绍Windows工作流基础规则引擎 。
有关这些组件的一个有趣的事情是,他们设计,让您可以在自己的应用程序主机设计时组件,设计套在自己的自定义类的背景下运作的规则和/或表达式。 举例来说,你告诉它来设计针对“myObject的”表达,一下子就知道,有具有secondMember其中有一个索引产生具有文本属性类型firstMember。 你可以坚持的表情和规则为XML,读回在运行时,无需使用设计器在运行。
特别是看到外部规则集工具包样品 。
不幸的是,C#不具备做的正是你所要求的任何本地设施。
然而,我的C#程序的eval确实允许用于评估的C#代码。 它提供了在运行时评估C#代码并支持许多C#语句,其中包括像“myobject.firstMember.secondMember [3]的.text”表达式。 事实上,这个代码是任何.NET项目中使用,然而,仅限于使用C#语法。 看看我的网站, http://csharp-eval.com ,了解更多详细信息。
你可以尝试我的轻质C#程序评估和演示。 它编译的C#语言的动态方法的主要子集。 在我的GitHub仓库全部细节DavidWynne / CSharpEval
据我所知,没有这样的内置eval函数。 你必须要走的正则表达式+的思考方式。 我还认为,Visual Studio是这样做。
下面是我使用的是找到动态嵌套属性..你需要addthe逻辑索引类似的东西......以及一些额外的检查......我赶上我的方法调用空/错误...
public static object FindDottedProperty(this object input, string propertyName) { if (input == null) return null; if (string.IsNullOrEmpty(propertyName)) return null; Queue props = new Queue(propertyName.Split('.')); if (props.Count == 0) return null; //start with input object and roll out property stack from there. object ret = input; while (props.Count > 0) { var prop = props.Dequeue(); if (string.IsNullOrEmpty(prop)) return null; /*** ADD INDEXER LOGIC HERE ***/ //get the property's value based on the current named item ret = ret.GetType().GetProperty(prop).GetValue(ret, null); if (null.Equals(ret)) return null; } //return looked up value return ret; }