构建表达式树

时间:2011-06-08 03:09:21

标签: c# linq lambda expression-trees

我正在努力解决如何为更多lambda构建表达式树的想法,例如下面的那个,更不用说可能有多个语句的东西了。例如:

Func<double?, byte[]> GetBytes
      = x => x.HasValue ? BitConverter.GetBytes(x.Value) : new byte[1] { 0xFF };

我很感激任何想法。

1 个答案:

答案 0 :(得分:5)

我建议您阅读list of methods on the Expression class,其中列出了您的所有选项以及Expression Trees Programming Guide

至于这个特定的例子:

/* build our parameters */
var pX = Expression.Parameter(typeof(double?));

/* build the body */
var body = Expression.Condition(
    /* condition */
    Expression.Property(pX, "HasValue"),
    /* if-true */
    Expression.Call(typeof(BitConverter),
                    "GetBytes",
                    null, /* no generic type arguments */
                    Expression.Member(pX, "Value")),
    /* if-false */
    Expression.Constant(new byte[] { 0xFF })
);

/* build the method */
var lambda = Expression.Lambda<Func<double?,byte[]>>(body, pX);

Func<double?,byte[]> compiled = lambda.Compile();