使用过Javascript中的Eval函数的兄弟肯定对这个函数情有独钟,该函数能动态的执行我们传递进去的表达式。使用Eval函数咱们能轻松的制作可编程的程序,那C#是否也有这样的函数呢?答案是肯定的,不过C#并没有实现现成的方法供我们使用。但是这并不能阻止咱们这帮爱偷懒的程序员们。
现在我们就在C#中实现一个Eval函数吧,具体操作如下:
图1
图2
图3
图4
程序代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61using 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); } } } } }
源码下载
最后
以上就是昏睡冷风最近收集整理的关于百行代码轻松实现C#中的Eval函数的全部内容,更多相关百行代码轻松实现C#中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复