读书人

有没有办法将动态编译后代码中的类的步

发布时间: 2013-12-04 17:21:01 作者: rapoo

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

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

读书人网 >C#

热点推荐