LINQ 式ツリーは、おそらくこれを行うための最も使いやすい方法です。おそらく次のようなものです。
OpCodes ( OpCodes.Newarr )を使用して IL を生成することもできます。スタックベースのプログラミングに慣れている場合は簡単です (そうでない場合は、難しい場合があります)。
最後に、CodeDom (疑似コードが似ています) を使用できますが、これは最も強力なツールですが、迅速な動的メソッドにはあまり適していません。コンパイラと緊密に連携しているため、ファイル システムのアクセス許可と手動の参照解決が必要です。
MSDN のサンプル
var ca1 = new CodeArrayCreateExpression("System.Int32", 10);
var cv1 = new CodeVariableDeclarationStatement("System.Int32[]", "x", ca1);
ソース - Code 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() );