日期:2014-05-18 浏览次数:20846 次
使用过Javascript中的Eval函数的兄弟肯定对这个函数情有独钟,该函数能动态的执行我们传递进去的表达式。使用Eval函数咱们能轻松的制作可编程的程序,那C#是否也有这样的函数呢?答案是肯定的,不过C#并没有实现现成的方法供我们使用。但是这并不能阻止咱们这帮爱偷懒的程序员们。
现在我们就在C#中实现一个Eval函数吧,具体操作如下:
图1
图2
图3
图4
using System; using System.Linq; using System.Text; using System.Collections.Generic; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflection; namespace CSHARP_EVAL_FUNCTION { public class EVAL { private static string prefix = @"using System; public static class DynamicClass { public static void Bomb() {"; public static string postfix = @"}}"; public string content { get; set; } public void Eval() { if (content == "") { Console.WriteLine("必须为Content属性赋予值"); return; } string code = prefix + content + postfix; CompilerResults result = null; using (var provider = new CSharpCodeProvider()) { var options = new CompilerParameters(); options.GenerateInMemory = true; result = provider.CompileAssemblyFromSource(options, code); 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//运行类 DynamicClass 中的HelloWorld方法 { Type dynamicClass = result.CompiledAssembly.GetType("DynamicClass"); dynamicClass.InvokeMember("Bomb", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); } } } } }