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?
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. –
@MikeStrobel ouais j'essayais d'abord de comprendre quelle était leur intention. – Nkosi
Correction du type d'argument pour que le lambda soit représentable comme 'Func