2017-09-19 4 views
0

ラムダ式の動的作成について、ここで多くの素晴らしい解答を読みましたが、自分では作成できません。e.ID == idラムダ式を動的に作成する方法

DBからエンティティをIDで選択する必要がありますが、そのタイプは事前にわかりません。タイプの名前のみ。だから、私は自分のコードに推測

var modelType = Assembly.Load("Models").GetTypes().First(t => t.Name == type + "Model"); 
MethodInfo method = typeof(CommonRepository).GetMethod("GetByExpression", 
          BindingFlags.Instance | BindingFlags.Public); 



var arg = Expression.Constant(null, modelType); 
var body = Expression.Convert(Expression.PropertyOrField(arg, "ID"), 
    typeof(int)); 
var lambda = Expression.Lambda<Func<object, bool>>(body); 

var model = method.Invoke(this, new object[] { lambda }); 

var field = modelType.GetProperty("Disable", BindingFlags.Instance); 
field.SetValue(model, false); 

this.marathonRepository.SaveOrUpdate(model); 

私はラムダの「e.ID」の部分を作りました。 "== id"の作り方?

答えて

1

私は、表現を構築する表現を理解するのに役立つコメントを使用して、その部分に表現を分割しようとします。

は、次のことを考えてみましょう...

// id 
var id = 2; 
var idConstant = Expression.Constant(id); 
// (object e) => ... 
var param = Expression.Parameter(typeof(object)); 
// (object e) => ((modelType)e).ID 
var property = Expression.PropertyOrField(Expression.Convert(param, modelType), "ID")); 
// (object e) => ((modelType)e).ID == id 
var body = Expression.Equal(property, idConstant); 

var lambda = Expression.Lambda<Func<object, bool>>(body, param); 
+0

はちょうど 'typeof演算(オブジェクト)として' param'を ''宣言し、ID'アクセサに ''変換(パラメータ、modelType)を追加し、あなたがしましたばっちり成功。 OPはまた 'ID'を' int'に変換しました。これは余分なものだったかもしれません。 –

+0

@MikeStrobelはい私は最初、彼らの意図がそこにあったかを理解しようとしていました。 – Nkosi

+0

'Func 'とは対照的に、 '?'が静的に知られていないラムダを 'Func 'として表現するように引数型を修正しました。 –

関連する問題