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 Include
moet zijn:
public void Include<T, R>(Expression<Func<T, R>> expression)