我有一个空白的方法
void DrawShape(Graphics g, int x, int y){
}
我想在运行时将“方法体”作为字符串传递,以便通过我的代码绘制形状,例如:
y =0;
while(x<100){
x++;
g.drawRectangle(rec1, x,y);
}
并且该方法将执行如下:
void DrawShape(Graphics g, int x, int y){
y =0;
while(x<100){
x++;
g.drawRectangle(rec1, x,y);
}
}
这将是美好的,但我不知道该怎么做。任何帮助表示赞赏
答案 0 :(得分:0)
查看动态编译代码,但需要传递整个类定义(包括using
语句)。
CodeDomProvider cdp = CodeDomProvider.CreateProvider("C#");
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;
cp.GenerateExecutable = false;
cp.IncludeDebugInformation = false;
// add assemblies if required:
// e.g. cp.ReferencedAssemblies.Add(...)
CompilerResults cr = cdp.CompileAssemblyFromSource(cp, new String[] { sourceCode });
如果没有错误(cr.Errors
),那么您可以访问动态生成的类型:
Assembly a = cr.CompiledAssembly;
Type[] types = a.GetTypes();
如果您的代码只有一个类定义,则类型将具有长度1.从此处,您可以调用该类型的实例,并将其强制转换为您定义的接口。
E.g。
interface IDrawXYZ {
void DrawShape(Graphics g, int x, int y);
}
String srcCode =@"
using System;
using System.Drawing;
public class MyObject1 : IDrawXYZ {
//...
}";
或者您可以查找接受MethodInfo
个对象和两个Graphics
参数的静态int
。