C#-我可以根据用户提供的字符串公式动态定义函数吗?
我可以使用lambda表达式定义func,如下所示:C#-我可以根据用户提供的字符串公式动态定义函数吗?,c#,.net,reflection,mathematical-expressions,C#,.net,Reflection,Mathematical Expressions,我可以使用lambda表达式定义func,如下所示: Func <int, int, int> Fxy = ( (a,b) => a + b ) ); // Fxy does addition 我可以像编码一样修改Fxy吗 Func <int, int, int> Fxy = ( (a,b) => a - b ) ); // Fxy does what the user wants
Func <int, int, int> Fxy = ( (a,b) => a + b ) ); // Fxy does addition
我可以像编码一样修改Fxy吗
Func <int, int, int> Fxy = ( (a,b) => a - b ) ); // Fxy does what the user wants
// (subtraction)
Func Fxy=((a,b)=>a-b));//Fxy做用户想要做的事情
//(减法)
我目前使用一个自制的表达式解析器来接受用户定义的公式。刚刚启动w.NET,我感觉可能有一种不太痛苦的方法来实现这一点。并不是那么容易。包含一些可用于将lambda表达式从文本转换为Func的动态Linq功能,请查看。尝试ncalc框架:
它简单且轻量级。System.Reflection.Emit命名空间用于动态生成代码。一般来说,它相当复杂,但可能有助于实现简单的函数,如减法。如果您计划使用不复杂的公式,JScript引擎将提供简单的解决方案:
Microsoft.JScript.Vsa.VsaEngine engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
MessageBox.Show(Microsoft.JScript.Eval.JScriptEvaluate("((2+3)*5)/2", engine).ToString());
别忘了添加对Microsoft.JScript
assembly的引用,在这里使用可能是个好主意
您的示例将转换为:
var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var sum = Expression.Subtract(a, b);
var lamb = Expression.Lambda<Func<int, int, int>>(sum, a, b);
Func<int, int, int> Fxy = lamb.Compile();
var a=Expression.Parameter(typeof(int),“a”);
VarB=表达式参数(typeof(int),“b”);
var sum=表达式减去(a,b);
var lamb=表达式Lambda(和,a,b);
Func Fxy=lamb.Compile();
当然,您将享受将字符串解析为正确表达式的乐趣。:-) 你见过动态林克吗?见:
var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var sum = Expression.Subtract(a, b);
var lamb = Expression.Lambda<Func<int, int, int>>(sum, a, b);
Func<int, int, int> Fxy = lamb.Compile();