博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现 Eval
阅读量:5131 次
发布时间:2019-06-13

本文共 2335 字,大约阅读时间需要 7 分钟。

主要是使用 CSharpCodeProvider,动态调用来进行返回。

首先会拼接成一个类的一个方法,然后返回这个方法的值。不过,因为还是使用反射,所以效率不高。

public static class StringHelper    {        private static string prefix = @"using System; public static class DynamicClass                                    {                                         public static double Bomb()                                         {
"; public static string postfix = @"}}"; public static double Eval(this string strResult) { if (strResult == "" || strResult == null) { return 0; } string strCode = prefix + "return " + strResult + ";" + postfix; CompilerResults result = null; using (CSharpCodeProvider provider = new CSharpCodeProvider()) { var options = new CompilerParameters(); options.GenerateInMemory = true; result = provider.CompileAssemblyFromSource(options, strCode); if (result.Errors.HasErrors) { var errorMsg = new StringBuilder(); foreach (CompilerError error in result.Errors) { errorMsg.AppendFormat("Line:{0},Column:{1},Content:{2}", error.Line, error.Column, error.ErrorText); } Console.WriteLine(errorMsg.ToString()); } else { Type dynamicClass = result.CompiledAssembly.GetType("DynamicClass"); object obj = dynamicClass.InvokeMember("Bomb", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); return (double)obj; } } return 0; } }

 

调用方法很简单:Console.WriteLine("1 + 2 + 3".Eval());

或者直接调用 JavaScript 的 Eval

public static object Eval(string s)        {            Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();            return Microsoft.JScript.Eval.JScriptEvaluate(s, ve);        }

 

还可以使用 DataTable 的 Compute进行计算

static DataTable dt = new DataTable();        public static object EvalDataTable(string s)        {            return dt.Compute(s, null);        }

 

 

相比较而言,DataTable 更快,其次 JavaScript的方法,最后就是反射的那个方法。

 

转载于:https://www.cnblogs.com/chenxygx/p/5462296.html

你可能感兴趣的文章
Windows 7 上安装Visual Studio 2015 失败解决方案
查看>>
iOS按钮长按
查看>>
Shell流程控制
查看>>
CSS属性值currentColor
查看>>
[Leetcode|SQL] Combine Two Tables
查看>>
《DSP using MATLAB》Problem 7.37
查看>>
ROS lesson 1
查看>>
js笔记
查看>>
c风格字符串函数
查看>>
python基础学习第二天
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
struts2学习(9)struts标签2(界面标签、其他标签)
查看>>
Android 导入jar包 so模块--导入放置的目录
查看>>
解决ajax请求cors跨域问题
查看>>
Android Studio
查看>>
zz 圣诞丨太阁所有的免费算法视频资料整理
查看>>
【大数模板】C++大数类 大数模板
查看>>
【123】
查看>>
《收获,不止Oracle》pdf
查看>>