Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-我可以根据用户提供的字符串公式动态定义函数吗?_C#_.net_Reflection_Mathematical Expressions - Fatal编程技术网

C#-我可以根据用户提供的字符串公式动态定义函数吗?

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

我可以使用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 
                                                  // (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();