首先建一个类://这是网上找的例子。这里演示了一个简单的操作。里面是写死的字符串。。以后可以写一个通用的方法。
public class dongtaibianyi { public static object CalcValue(string expression) { var codeProvider = new CSharpCodeProvider(); var parameters = new CompilerParameters(); parameters.GenerateExecutable = false; parameters.GenerateInMemory = true; StringBuilder sb = new StringBuilder(); sb.AppendLine("using System;"); sb.AppendLine("public class DynamicClass {"); sb.AppendLine(" public static object CalcValue() {"); sb.AppendLine(" return " + expression + ";"); sb.AppendLine(" }"); sb.AppendLine("}"); var result = codeProvider.CompileAssemblyFromSource(parameters, sb.ToString()); if (result.CompiledAssembly != null) { MethodInfo method = result.CompiledAssembly.GetType("DynamicClass") .GetMethod("CalcValue", BindingFlags.Static | BindingFlags.Public); return method.Invoke(null, null); } return null; } }
接下来再Main函数中调用:
static void Main(string[] args) { //chongzai c1 = new chongzai() { canshu1 = 34 }; //chongzai c2 = new chongzai() { canshu1 = 78 }; //chongzai c3 = new chongzai() { canshu1 = 128 }; //Int32 jsjsj =c3+(c2+(c1 + 0)); //Int32 klkkl = c1 + 3;//操作符重载 //string s1 = (string)c2;//转换操作符。。显式 //c2 = "1024";//转换操作符。。隐式 //Console.WriteLine("操作符重载结果:{0}" + klkkl); //Console.WriteLine("显示转换操作符结果:{0}" + s1); //Console.WriteLine("隐式转换操作符结果:{0}" + c2.canshu1); //Console.ReadKey(); object result = dongtaibianyi.CalcValue("5*2"); Console.WriteLine("{0} ({1})", result, result.GetType()); Console.ReadKey(); }
这里的注释类容是上一个笔记中的重载操作符。。。我把他们写在一起了。。。因为我想到了一个主意。
通过 重载操作符 和 动态编译 这两种方法结合在一起。可以实现一个 作用于 复杂类型 的 计算器。。。。