Waarom zijn sommige objecteigenschappen UnaryExpression en andere MemberExpression?

Het antwoord op mijn Selecteer een modeleigenschap met behulp van een lambda en niet een stringeigenschapnaamvraag, die als volgt eigenschappen aan een verzameling wil toevoegen:

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);

Ik heb de volgende code geschreven met de methode 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;
    }

Bij het uitvoeren van de code ontdekte ik echter dat sommige lambda’s MemberExpression-waarden opleverden zoals verwacht, maar andere UnaryExpression-waarden. Ik moest de eerste regel code in het volgende veranderen voordat ik al mijn eigenschappen kon toevoegen met behulp van lambdas:

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

Alle eigenschappen zijn ‘eenvoudige’ typen, d.w.z. string, DateTime, int, bool, enz. in een POCO-bedrijfsobject. Ze zijn versierd met verschillende DataAnnotations-attributen.

Waarom geven sommige lambda’s in mijn voorbeeld MemberExpression-waarden en andere UnaryExpression-waarden? In mijn voorbeeld staat de eerste UnaryExpressionop de derde regel, de eigenschap DateTime, maar booleaanse eigenschappen resulteren ook in UnaryExpressions.


Antwoord 1, autoriteit 100%

Ik denk dat ik weet wat het probleem is. Uw expressie retourneert type object.

Als je dit verandert in Expression<Func<T, R>>moet het retourtype correct worden afgeleid, en UnaryExpression(waarvan ik aanneem dat het een bewerking) mag niet plaatsvinden.

Bijwerken:

De handtekening voor Includemoet zijn:

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

Other episodes