Comment créer une expression lambda qui retourne la propriété de l’object avec le nom de cette propriété?

Je suis complètement perdu sur celui-ci. J’ai un morceau de code qui fait ce dont j’ai besoin quand implémenté comme ceci:

return filters.Add(m => m.Metadata.RecordId).IsEqualTo(1); 

où m est un object de la classe TestObj et l’argument de la méthode Add est Expression<Func> .

Maintenant, le problème est que je ne peux pas coder m.Metadata.RecordId à l’intérieur de Add, car ce que j’obtiens ici est une chaîne qui m’informe sur la propriété à utiliser, dans ce cas, “Metadata.RecordId”. ce que je dois faire est de construire une telle expression avec cette chaîne qui fera la même chose que m => m.Metadata.RecordId. J’ai besoin de quelque chose comme ça:

 ssortingng propertyName = "Metadata.RecordId"; Expression expr = null;//create expression here somehow that will do the same as m => m.Metadata.RecordId return filters.Add(expr).IsEqualTo(1); 

Comment je fais ça?

Je ne suis pas sûr de ce que vous voulez exactement comme sortie (bool, int et compare),
Mais cela devrait vous mettre sur la bonne voie …

 public static void Test(ssortingng propertyPath) { var props = propertyPath.Split('.'); Expression parameter = Expression.Parameter(typeof(TestObj), "x"); Expression property = parameter; foreach (var propertyName in props) property = Expression.Property(property, propertyName); Expression> lambdaExpression = Expression.Lambda>(property, parameter as ParameterExpression); Add(lambdaExpression); } static void Add(Expression> paramExp) { TestObj obj = new TestObj { Metadata = new Metadata { RecordId = 1, Name = "test" } }; var id = paramExp.Comstack()(obj); } 

Et vous pouvez également consulter ce post de Jon qui décrit joliment comment cela fonctionne …
Utilisez la reflection pour obtenir l’expression lambda de la propriété Name

Qu’en est-il de cet appel:

 return filters.Add(m => ReflectionMagic(m, "Metadata.RecordId").IsEqualTo(1); 

La méthode aurait cette signature:

 public object ReflectionMagic(object source, ssortingng property); 

Si cela fonctionne, vous pouvez faire quelque chose comme ceci:

 var propertyTree = property.Split('.'); foreach(var propertyName in propertyTree) { var propInfo = source.GetType().GetProperty(propertyName); var source = propInfo.GetValue(source, null); } return source; 

Sachez que tout type d’argument et de contrôle de valeur de retour sont manquants et sont laissés comme un exercice au lecteur.