首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

有没有办法将动态编译后代码中的类的步骤赋给一个委托

2013-12-04 
有没有办法将动态编译后代码中的类的方法赋给一个委托? CSharpCodeProvider provider new CSharpCodePro

有没有办法将动态编译后代码中的类的方法赋给一个委托?

 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 = Expression.Lambda<Action>(callfoo, new List<ParameterExpression>());
            Action result = lambda.Compile();
            result();
        }
    }
}

热点排行