您的位置:首页 > 编程语言 > C#

动态地生成用户输入的函数表达式(C#)

2008-10-11 08:42 330 查看
/article/4676176.html

C# code
// Expression.cs - 动态生成数学表达式并计算其值
// 表达式使用 C# 语法,可带一个的自变量(x)。
// 表达式的自变量和值均为(double)类型。
// 使用举例:
//   Expression expression = new Expression("Math.Sin(x)");
//   Console.WriteLine(expression.Compute(Math.PI / 2));
//   expression = new Expression("double u = Math.PI - x;" +
//     "double pi2 = Math.PI * Math.PI;" +
//     "return 3 * x * x + Math.Log(u * u) / pi2 / pi2 + 1;");
//   Console.WriteLine(expression.Compute(0));

using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.Text;

namespace Skyiv.Util
{
sealed class Expression
{
object instance;
MethodInfo method;

public Expression(string expression)
{
if (expression.IndexOf("return") < 0) expression = "return " + expression + ";";
string className = "Expression";
string methodName = "Compute";
CompilerParameters p = new CompilerParameters();
p.GenerateInMemory = true;
CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromSource(p, string.
Format("using System;sealed class {0}{{public double {1}(double x){{{2}}}}}",
className, methodName, expression));
if(cr.Errors.Count > 0)
{
string msg = "Expression(/"" + expression + "/"): /n";
foreach (CompilerError err in cr.Errors) msg += err.ToString() + "/n";
throw new Exception(msg);
}
instance = cr.CompiledAssembly.CreateInstance(className);
method = instance.GetType().GetMethod(methodName);
}

public double Compute(double x)
{
return (double)method.Invoke(instance, new object [] { x });
}
}
}


C# code
// ExpressionTest.cs - 动态生成数学表达式并计算其值的测试程序
// 编译方法: csc ExpressionTest.cs Expression.cs

using System;
using Skyiv.Util;

namespace Skyiv.Test
{
class ExpressionTest
{
static void Main(string [] args)
{
try
{
if (args.Length > 0)
{
Console.WriteLine("f(x): {0}", args[0]);
Expression expression = new Expression(args[0]);
for (int i = 1; i < args.Length; i++)
{
double x = double.Parse(args[i]);
Console.WriteLine("f({0}) = {1}", x, expression.Compute(x));
}
}
else Console.WriteLine("Usage: ExpressionTest expression [ parameters  ]");
}
catch (Exception ex)
{
Console.WriteLine("错误: " + ex.Message);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: