日期:2014-05-17  浏览次数:20831 次

有没有办法将动态编译后代码中的类的方法赋给一个委托?
 CSharpCodeProvider provider = new CSharpCodeProvider();
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append("namespace TestName");
sb.Append("{");
sb.Append("     public class MyClass");
sb.Append("     {");
sb.Append("         public void Hello()");
sb.Append("         {");
sb.Append("             Console.Writeline(\"Hello World!\");");
sb.Append("         }");
sb.Append("     }");
sb.Append("}");
CompilerParameters param = new CompilerParameters();
param.GenerateExecutable = false;
param.GenerateInMemory = true;
CompilerResults result = provider.CompileAssemblyFromSource(param, sb.ToString());


比如上面这段动态编译, 有没有办法把里面的Hello方法赋给Func< >?

------解决方案--------------------
1.sb.Append("             Console.Writeline(\"Hello World!\");");
  Writeline 的 L大写;
2.你代码后面加上

if (result.Errors.HasErrors)
    return;
var assembly = result.CompiledAssembly;
var myClass = assembly.CreateInstance("TestName.MyClass");
myClass.GetType().GetMethod("Hello").Invoke(myClass, null);

------解决方案--------------------
可以用表达式树,为了简化,我就省略了动态编译,给你演示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class A
    {
        public void foo() { Console.WriteLine("hello"); }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var newa = Expression.New(typeof(A));
            var callfoo = Expression.Call(newa, typeof(A).GetMethod("foo"));
            var lambda =&n