[求助]如何将字符串表达式转换为C#的表达式?
比如有 "(50> 40 && 50 <30) || (90> 60) " 这样一个字符串,如何写一个函数,将它转换为 (50> 40 && 50 <30) || (90> 60) ,然后判断其是否是true,false?
------解决方案--------------------using System;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
namespace Obx.Common.Utilities
{
public class ObxEvaluator
{
object _compiled = null;
private string m_formula;
/// <summary>
/// Evaluate a numeric string
/// </summary>
public string Formula
{
get { return m_formula; }
set { m_formula = value; }
}
/// <summary>
///
/// </summary>
public ObxEvaluator() { }
/// <summary>
///
/// </summary>
/// <param name= "formula "> </param>
public ObxEvaluator(string formula)
{
Formula = formula;
}
/// <summary>
///
/// </summary>
/// <returns> </returns>
public Double Execute()
{
if (Formula == null || Formula == " ")
{
throw new Exception( "Please set formula first! ");
}
return this.Execute(Formula);
}
/// <summary>
///
/// </summary>
/// <returns> </returns>
public Boolean ExecuteBoolean()
{
if (Formula == null || Formula == " ")
{
throw new Exception( "Please set formula first! ");
}
constructEvaluator(Formula);
MethodInfo m = _compiled.GetType().GetMethod( "GetBooleanValue ");
return (Boolean)m.Invoke(_compiled, null);
}
//public DateTime ExecuteDateTime()
//{
// if (Formula == null || Formula == " ")
// {
// throw new Exception( "Please set formula first! ");
// }
// constructEvaluator(Formula);
// MethodInfo m = _compiled.GetType().GetMethod( "GetDateTimeValue ");
// return (DateTime)m.Invoke(_compiled, null);
//}
/// <summary>
///
/// </summary>
/// <param name= "formula "> </param>
/// <returns> </returns>
public Double Execute(string formula)
{
constructEvaluator(formula);
MethodInfo m = _compiled.GetType().GetMethod( "GetValue ");
return (Double)m.Invoke(_compiled, null);
}
/// <summary>
///
/// </summary>
/// <param name= "formula "> </param>
private void constructEvaluator(string formula)
{
ICodeCompiler compiler = (new CSharpCodeProvider().CreateCompiler());
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add( "system.dll ");