xxxxプログラマのメモ

先人に感謝と敬意

Dynamic Expression Tree where #リンク #動的 #式 

何もしない場合
return (_ => true);

ublic class Predicate
{
  // 動的にId or 名前条件用ラムダ式を生成する
  // r => r.Id == id || r => r.Name.Contains(name)という式を動的に作る
  public static Func GetPredicate(int id, string name)
  {  
    // パラメータの定義する:r
    ParameterExpression param =
      Expression.Parameter(typeof(Restaurant), "r");

    // Idのbodyの左を定義する:r.Id
    MemberExpression left = Expression.Property(param, "Id");

    // Idのbodyの右を定義する:id
    ConstantExpression right =
      Expression.Constant(id, typeof(int));

    // Idのbodyを定義する:r.Id == id
    BinaryExpression body = Expression.Equal(left, right);

    // Nameの属性を定義する:r.Name
    MemberExpression nameProperty = Expression.Property(param, "Name");

    // Name定数を定義する:name
    ConstantExpression nameConstant = Expression.Constant(name, typeof(string));

    // Nameのbodyを定義する:r.Name.Contains(name)
    MethodCallExpression nameBody = Expression.Call(nameProperty,
        typeof(string).GetMethod("Contains"), nameConstant);

    // 全体のbodyを定義する
    // r => r.Id == id || r => r.Name.Contains(name)
    BinaryExpression body = Expression.Or(idBody, nameBody);

    // 式ツリーを(r => r.Id == id || r => r.Name.Contains(name))を組み立て、
    // 実行コードにコンパイルする
    return Expression.Lambda>(
      body, param).Compile();
  }
}

 StringComparison comparison = StringComparison.InvariantCultureIgnoreCase;
                    pidBody = Expression.Call(pidProperty,
                        typeof(string).GetMethod("StartsWith", new Type[] {typeof(string), comparison.GetType() }), pidConstant, Expression.Constant(comparison));

stackoverflow.com
stackoverflow.com
ameblo.jp

Thanks!