Actuando sobre la respuesta a mi pregunta Select a model property using a lambda and not a string property name, queriendo añadir propiedades a una colección de la siguiente manera:¿Por qué algunas propiedades de objeto son UnaryExpression y otras MemberExpression?
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);
que escribió el código siguiente en el Include
método:
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;
}
Sin embargo, en el funcionamiento de la código, encontré algunas de las lambdas rindieron MemberExpression valores como se esperaba, pero otros dieron UnaryExpression valores. Tenía que cambiar la primera línea de código a la siguiente antes de que pudiera añadir todos mis inmueble con lambdas:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
Todas las propiedades son tipos 'simples', es decir, la secuencia, DateTime, int, bool, etc. un objeto comercial de POCO. Están decorados con varios atributos DataAnnotaciones.
Lo que hace que algunas de las lambdas en mi ejemplo para producir MemberExpression valores y otros UnaryExpression valores? En mi ejemplo, el primer UnaryExpression está en la tercera línea, la propiedad DateTime, pero las propiedades booleanas también dan como resultado UnaryExpressions.
significa la expresión UnaryExpression puede que se producen en la presencia (o 'unpresence') de columnas anulables * *? – leppie
@leppie, sospecho que está en columnas que no admiten nulos. En mi ejemplo, el primer UnaryExpression está en un DateTime, donde las MemberExpressions anteriores están en cadenas. Una posterior UnaryExpression está en bool. – ProfK
Investigaré un poco. He utilizado (o más bien abusado) expresiones como esta antes, y nunca tuve problemas, lo que significa que siempre fue un 'MemberExpression', de lo contrario, mi código fallaría. ¿En qué versión de .NET se está ejecutando? Yo no uso .NET 4 todavía. – leppie