65.9K
CodeProject 正在变化。 阅读更多。
Home

C# Eval 函数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.58/5 (20投票s)

2006年3月6日

CPOL
viewsIcon

269589

downloadIcon

3466

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);
                }
            }
        }
    }
}
© . All rights reserved.