首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表达式求值为字符串,返回对象?

将表达式求值为字符串,返回对象?
EN

Stack Overflow用户
提问于 2011-04-12 03:11:18
回答 2查看 2K关注 0票数 3

基本上我有一些代码,当它发生时,我需要将某个对象设置为某个表达式。所有这些“做什么”的jazz都存储为一个字符串。所以我解析它,并使用反射来找到我要做的对象。现在,我需要了解如何将值存储到此对象中。问题是值可以是"1“、"1*(5/2)”或“某个字符串值”。如果我能有像"this.SomeProperty“或"(x >3?4: 5)”这样的表达式,那就太酷了。

此外,它存储到的对象至少可以是字符串、整型、双精度或浮点型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-12 04:29:22

VS2008示例包含一个漂亮的ExpressionParser,它可以用作通用表达式解析器(VS2008 Samples)。通过一些小的更新和一个定制的工厂类,我们可以把它变成更具表现力的东西:

代码语言:javascript
复制
string expression = "(1 + 2)";
var func = FunctionFactory.Create<int>(expression);

或者:

代码语言:javascript
复制
expression = "(a * b)";
var func2 = FunctionFactory.Create<int, int, int>(expression, new[] { "a", "b" });

这些Create方法的返回类型是Func<>实例,这意味着我们得到了很好的强类型委托:

代码语言:javascript
复制
int result = func2(45, 100); // result = 450;

我已经将代码推送到gist

更新:我最近也blogged about this了。

更新2,另一个例子:

代码语言:javascript
复制
var person = new Person { Age = 5 };
string expression = "(Age == 5)";
var func3 = FunctionFactory.Create<Person, bool>(expression);

bool isFive = func3(person); // Should be true.
票数 1
EN

Stack Overflow用户

发布于 2011-08-10 23:12:28

你看到http://ncalc.codeplex.com了吗?

它的可扩展性,快速(例如,有自己的缓存)使你能够通过处理EvaluateFunction/EvaluateParameter事件在运行时提供自定义函数和变量。它可以解析的示例表达式:

代码语言:javascript
复制
Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

  e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
  e.Parameters["X"] = 10; 

  e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
      if (name == "Pi") 
      args.Result = 3.14; 
    }; 

  Debug.Assert(117.07 == e.Evaluate()); 

它还在本地处理unicode &许多数据类型。如果你想改变语法,它会附带一个鹿角文件。还有一个fork,它支持MEF加载新函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5626256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档