Pourquoi certaines propriétés de l'objet UnaryExpression et d'autres MemberExpression?

StackOverflow https://stackoverflow.com/questions/3567857

  •  01-10-2019
  •  | 
  •  

Question

Agir sur la réponse à ma Sélectionnez une propriété modèle en utilisant un lambda et non la question d'un nom de propriété de chaîne, voulant ajouter des propriétés à une collection comme suit:

var props = new ExportPropertyInfoCollection<JobCard>();
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<T>
{
    public void Include(Expression<Func<T, object>> 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, sur l'exécution du code, j'ai trouvé quelques-uns des lambdas MemberExpression valeurs comme prévu, mais d'autres cédais UnaryExpression valeurs. Je devais changer la première ligne de code à la suivante avant que je puisse ajouter toutes mes propriétés en utilisant lambdas:

var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;

Toutes les propriétés sont des types 'simples', à savoir la chaîne, DateTime, int, bool, etc. dans un objet métier poco. Elles sont décorées avec plusieurs variant DataAnnotations attributs .

Quelles sont les causes certaines des lambdas dans mon exemple pour donner MemberExpression valeurs et autres UnaryExpression valeurs? Dans mon exemple, le premier UnaryExpression est sur la troisième ligne, DateTime propriété, mais les propriétés booléennes résultent également UnaryExpressions .

Était-ce utile?

La solution

Je pense que je sais ce que le problème est. Vos retours d'expression de type object.

Si vous changez cela Expression<Func<T, R>> le type de retour doit être correctement inféré et UnaryExpression (que je suppose, est une opération de boxe) ne devrait pas se produire.

Mise à jour:

La signature Include devrait être:

public void Include<T, R>(Expression<Func<T, R>> expression)
scroll top