基本上我有一些代码,当它发生时,我需要将某个对象设置为等于某个表达式。所有这些“做什么”爵士乐都存储为字符串。所以我解析它,并使用反射来查找我正在执行此操作的对象。现在我需要找出如何将值存储到该对象。问题是该值可能是“1”、“1*(5/2)”或“某个字符串值”。如果我可以有像“this.SomeProperty”或“(x > 3 ? 4 : 5)”这样的表达式,那就太酷了。
此外,它存储的对象至少可以是字符串、int、double 或 float。
VS2008 示例包含一个漂亮的ExpressionParser
它可以用作通用表达式解析器(VS2008 示例)。通过一些小的更新和自定义工厂类,我们可以将其变成更具表现力的东西:
string expression = "(1 + 2)";
var func = FunctionFactory.Create<int>(expression);
Or:
expression = "(a * b)";
var func2 = FunctionFactory.Create<int, int, int>(expression, new[] { "a", "b" });
这些的返回类型Create
方法是Func<>
实例,这意味着我们得到了很好的强类型委托:
int result = func2(45, 100); // result = 450;
我已将代码推送到gist
Update: 我最近在博客上谈到了这一点 too.
Update 2, 另一个例子:
var person = new Person { Age = 5 };
string expression = "(Age == 5)";
var func3 = FunctionFactory.Create<Person, bool>(expression);
bool isFive = func3(person); // Should be true.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)