System.Linq.Expressions名前空間のクラスを使って式木(expression tree, 式ツリーとも)を作成することによっても実行可能なコードを動的に生成することができます。 .NET Framework 4以降では、式だけでなく条件分岐やループなどのブロック構文も扱うことができるようになっています。 式木では生成したコードをデリゲートに変換(コンパイル)し、任意に呼び出すことができます。

System.Linq.Expressions名前空間のクラスを使って単純な式木を構築して呼び出す
using System;
using System.Linq.Expressions;

class Sample {
  static void Main()
  {
    // 以下のラムダ式と同様の式木を生成する
    // Action<string> a = s => Console.WriteLine(s.ToUpper());

    // 式木に渡されるパラメータ(string型)
    var s = Expression.Parameter(typeof(string), "s");

    // Console.WriteLine(param.ToUpper())に相当する式木を生成する
    var printUpperCase = Expression.Call(
      typeof(Console).GetMethod("WriteLine", new[] {typeof(string)}),
      Expression.Call(s, typeof(string).GetMethod("ToUpper", Type.EmptyTypes))
    );

    // 式木を構成してラムダ式に変換する
    var lambda = Expression.Lambda<Action<string>>(printUpperCase, new[] {s});

    // デリゲートに変換する
    var a = lambda.Compile();

    // 変換したデリゲートに引数を渡して呼び出す
    a("Hello, world!");
  }
}
実行結果
Hello, world!