zoukankan      html  css  js  c++  java
  • 动态编译代码段,并执行方法---------------------------C#

    首先建一个类://这是网上找的例子。这里演示了一个简单的操作。里面是写死的字符串。。以后可以写一个通用的方法。

     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();
            }

    这里的注释类容是上一个笔记中的重载操作符。。。我把他们写在一起了。。。因为我想到了一个主意。

    通过  重载操作符动态编译 这两种方法结合在一起。可以实现一个 作用于 复杂类型 的 计算器。。。。 

  • 相关阅读:
    封装图片处理类(缩略图)
    封装表单验证类
    魔术方法
    封装自己的smartyBC类
    快捷键
    unicode
    基本数据类型课上练习
    数制总结
    12.29.作业
    12.28作业
  • 原文地址:https://www.cnblogs.com/xiaoleye/p/5195505.html
Copyright © 2011-2022 走看看