70 votes

Pourquoi certaines propriétés d'objet sont-elles UnaryExpression et d'autres MemberExpression?

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.

58voto

leppie Points 67289

Je pense savoir quel est le problème. Votre expression renvoie le type objet.

Si vous modifiez cela en Expression>, le type de retour devrait être correctement déduit, et UnaryExpression (que je suppose être une opération de boxage) ne devrait pas se produire.

Mettre à jour :

La signature de Include devrait être :

public void Include(Expression> expression)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X