Agissant sur la réponse à ma question Choisir une propriété de modèle à l'aide d'une lambda et non d'un nom de propriété sous forme de chaîne, voulant ajouter des propriétés à une collection comme suit:
var props = new ExportPropertyInfoCollection();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);
J'ai écrit le code suivant dans la méthode Include
:
public class PropertyCollection
{
public void Include(Expression> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
Properties.Add(pes.Property.Property.Name, pes.Property);
return pes;
}
Cependant, en exécutant le code, j'ai constaté que certaines des lambdas renvoyaient des valeurs MemberExpression comme prévu, mais d'autres renvoyaient des valeurs UnaryExpression. J'ai dû modifier la première ligne de code en ce qui suit avant de pouvoir ajouter toutes mes propriétés à l'aide de lambdas:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
Toutes les propriétés sont des types 'simples', c'est-à-dire des chaînes, des objets DateTime, des entiers, des booléens, etc. dans un objet métier POCO. Elles sont décorées avec plusieurs attributs DataAnnotations variés.
Qu'est-ce qui fait que certaines des lambdas de mon exemple renvoient des valeurs MemberExpression et d'autres des valeurs UnaryExpression? Dans mon exemple, le premier UnaryExpression se trouve à la troisième ligne, la propriété DateTime, mais les propriétés booléennes donnent également des UnaryExpressions.