2017-09-19 3 views
0

J'ai lu beaucoup de bonnes réponses ici sur la pile à propos de la création dynamique de l'expression lambda, mais je ne peux pas faire la mienne.Comment créer dynamiquement e.ID == id expression lambda

Je dois sélectionner l'entité de DB par ID, mais je ne connais pas son type à l'avance. Seul le nom d'un type. Alors:

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); 

Je pense que dans mon code, je l'ai fait partie "e.ID" de lambda. Comment faire "== id" partie?

Répondre

1

J'essaie de décomposer l'expression en ses parties, en utilisant des commentaires pour aider à comprendre l'expression à construire.

Considérez ce qui suit ...

// 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

Il suffit de déclarer 'param' comme' typeof (objet) et '' ajouter un Convert (param, modelType) '' dans l'accesseur ID', et vous avez j'y suis arrivé. OP a également eu une conversion sur 'ID' en' int', ce qui peut ou non être superflu. –

+0

@MikeStrobel ouais j'essayais d'abord de comprendre quelle était leur intention. – Nkosi

+0

Correction du type d'argument pour que le lambda soit représentable comme 'Func ' par opposition à 'Func ' où '?' N'est pas connu statiquement. –