Func<T> から Expression<Func<T>> のインスタンスを生成する方法
次のような関数を作ろうとしています。
public static void Hoge<int>(Func<int> function)
{
var value = function();
var expression = new Expression<Func<int>>(function); // ←ビルドエラー。何か方法は無いか?
var name = (expression.Body as MemberExpression).Member.Name;
// 以下、valueとnameを使った処理
}
Hoge(() => x)
という感じに呼び出して、変数名x
とその値を同時に渡したいのです。
しかし、このようなExpression<T>
のコンストラクタは存在しないので、このままでは実現できません。
Hoge()
の引数をExpression<Func<int>>
にして、Compile()
してから実行して値を取り出す、というのも可能ですが、Compile()
がとても遅いのでやりたくないです。
※MemberExpression
経由で変数名を取り出すのに比べて2桁以上遅い
↓こういう形ならさくっとExpression
インスタンスを作れるから簡単だろうと思いましたが、もしかしてこれはコンパイル時にすごいことをやってくれているだけなのであって、実行時にやろうとすると容易ではないのでしょうか?
int x = 10;
Expression<Func<int>> exp = () => x;