用C#winform绘制形状的反射方法

时间:2015-03-21 10:11:21

标签: c# winforms reflection drawing

我有一个空白的方法

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

这将是美好的,但我不知道该怎么做。任何帮助表示赞赏

1 个答案:

答案 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