C# Eval 函数






3.58/5 (20投票s)
C# eval 函数。
引言
本文介绍了一个 C# eval 函数,以及如何解析和评估表达式。它支持布尔、位运算、算术、一元运算、括号、成员(例如 object.property
)、索引器(例如 array[index]
)和 ConditionalIf(?:)
,还支持变量赋值。
您可以使用它来评估 C# 源代码中的一个语句。
它不使用运行时编译器。
它不使用 JScript.NET。
它不使用 DataTable。
Using the Code
表达式示例
Basic
2+3*5
true||false
a+b*c
a.b+c.d
a.f(1,2)[b]
"123"[0]
"123".Length
(1).ToString()
所有函数或属性都使用反射进行评估。它没有全局函数,并且其语法在运行时进行检查。
如果您设置 Parameter 'string'=typeof(string)
,那么它可以这样做
string.Format("{0}1111",233)
如果一个参数是一个类型,它将调用它的 static
函数或属性。
高级
(a>b)?c:d
Reflection(反射)
("To"+"String")()
示例用法
using System;
using Jyc.Expr;
namespace TestExpr
{
class Program
{
static void Main(string[] args)
{
Parser ep = new Parser();
Evaluater evaluater = new Evaluater();
ParameterVariableHolder pvh = new ParameterVariableHolder();
pvh.Parameters["char"] = new Parameter(typeof(char));
pvh.Parameters["sbyte"] = new Parameter(typeof(sbyte));
pvh.Parameters["byte"] = new Parameter(typeof(byte));
pvh.Parameters["short"] = new Parameter(typeof(short));
pvh.Parameters["ushort"] = new Parameter(typeof(ushort));
pvh.Parameters["int"] = new Parameter(typeof(int));
pvh.Parameters["uint"] = new Parameter(typeof(uint));
pvh.Parameters["long"] = new Parameter(typeof(string));
pvh.Parameters["ulong"] = new Parameter(typeof(ulong));
pvh.Parameters["float"] = new Parameter(typeof(float));
pvh.Parameters["double"] = new Parameter(typeof(double));
pvh.Parameters["decimal"] = new Parameter(typeof(decimal));
pvh.Parameters["DateTime"] = new Parameter(typeof(DateTime));
pvh.Parameters["string"] = new Parameter(typeof(string));
pvh.Parameters["Guid"] = new Parameter(typeof(Guid));
pvh.Parameters["Convert"] = new Parameter(typeof(Convert));
pvh.Parameters["Math"] = new Parameter(typeof(Math));
pvh.Parameters["Array "] = new Parameter(typeof(Array));
pvh.Parameters["Random"] = new Parameter(typeof(Random));
pvh.Parameters["TimeZone"] = new Parameter(typeof(TimeZone));
pvh.Parameters["AppDomain "] = new Parameter(typeof(AppDomain));
pvh.Parameters["Console"] = new Parameter(typeof(Console));
pvh.Parameters["evaluater"] = new Parameter(evaluater);
evaluater.VariableHolder = pvh;
while (true)
{
System.Console.WriteLine("Input line,press Return to Eval:");
string line = System.Console.ReadLine().Trim();
if (string.IsNullOrEmpty(line))
break;
try
{
Tree tree = ep.Parse(line);
tree.Print(System.Console.Out);
object result = evaluater.Eval(tree);
if( result != null )
System.Console.WriteLine("Result:{0}", result);
else
System.Console.WriteLine("Result is null");
}
catch (Exception e)
{
System.Console.WriteLine("Exception:" + e.GetType().Name _
+"->"+ e.Message);
}
}
}
}
}