読者です 読者をやめる 読者になる 読者になる

ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

式木で動的コード生成やってみた

なれると割と素直に書けるねこれ、めんどくさいけど
.NET Framework3.0あたりで追加されて、4.0で強化された式木を使って動的にプロパティをわさわさしてみます。
[雑記] 動的コード生成のパフォーマンス (C# によるプログラミング入門)
この辺を参考にやってみました。

var t = hoge.GetType();
var x = Expression.Parameter(typeof(object)); // Object型のローカル変数
var p = Expression.Parameter(t);
var exp = Expression.Lambda(
    Expression.Block(
        new [] { p }, // ローカル変数の宣言
        Expression.Assign(p, Expression.Convert(x , t)), // 値の代入、型変換
        Expression.Property(p, "Path")) // プロパティから値の取得
    , x); // 引数
var assign = exp.Compile(); // 式木のコンパイル

何をしているかというと、だいたいこんな感じです。

FUnc<object, object> assign = x =>
{ 
    T p;
    p = (T)x;
     return p.Path;
};

うん、変数を事前に定義する以外はほぼそのまんまで素直ね。普通にリフレクションするよりもパフォーマンスもいいらしいので、もし動的にプロパティをたたきたいときはリフレクションよりもこっちを使うといいと思います。最後の引数を忘れがちなので注意ですかね。これがないと引数なしのラムダ式を組み立ててしまうので実行時にエラー吐きます。