LINQ 表达式树可能是这样做的最友好的方式:也许是这样的:
您还可以使用 OpCodes ( OpCodes.Newarr ) 生成 IL。如果您对基于堆栈的编程感到满意,这很容易(否则,可能会很有挑战性)。
最后,您可以使用 CodeDom(类似于您的伪代码),但是——虽然是最强大的工具——它对于快速动态方法不太理想。由于您与编译器密切合作,因此它需要文件系统权限和手动参考解析。
来自 MSDN 的示例
var ca1 = new CodeArrayCreateExpression("System.Int32", 10);
var cv1 = new CodeVariableDeclarationStatement("System.Int32[]", "x", ca1);
Source - 使用代码 DOM 创建数组
如果您想要一个字符串的直接原始编译,您可以省略语句的面向对象处理,而只构建一个大字符串。就像是:
var csc = new CSharpCodeProvider( new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } } );
var cp = new CompilerParameters() {
GenerateExecutable = false,
OutputAssembly = outputAssemblyName,
GenerateInMemory = true
};
cp.ReferencedAssemblies.Add( "mscorlib.dll" );
cp.ReferencedAssemblies.Add( "System.dll" );
cp.ReferencedAssemblies.Add( "System.Core.dll" );
StringBuilder sb = new StringBuilder();
// The string can contain any valid c# code, but remember to resolve your references
sb.Append( "namespace Foo{" );
sb.Append( "using System;" );
sb.Append( "public static class MyClass{");
// your specific scenario
sb.Append( @"public static readonly string[] LevelMap = {
""WWWWWWWWWWWWWWWWWWW"",
""WGGGGGGGGGGGGGGGGGW"",
""WGGGGGGGGGGGGGGGGGW"",
""WWWWWWWWWWWWWWWWWWW"" };" );
sb.Append( "}}" );
// "results" will usually contain very detailed error messages
var results = csc.CompileAssemblyFromSource( cp, sb.ToString() );