.net - net - ¿Por qué algunas propiedades de objetos son UnaryExpression y otros MemberExpression?
linq query (1)
Creo que sé cuál es el problema. Su expresión devuelve tipo de object
.
Si cambia esto a Expression<Func<T, R>>
el tipo de retorno debería inferirse correctamente, y no debería producirse UnaryExpression
(que supongo que es una operación de boxeo).
Actualizar:
La firma para Include
debe ser:
public void Include<T, R>(Expression<Func<T, R>> expression)
Actuando sobre la respuesta a mi propiedad Seleccione un modelo usando una pregunta de lambda y no de nombre de propiedad de cadena , que quiera agregar propiedades a una colección de la siguiente manera:
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);
Escribí el siguiente código en el método 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;
}
Sin embargo, al ejecutar el código, encontré que algunas de las lambdas arrojaron los valores de MemberExpression como se esperaba, pero otras arrojaron valores de UnaryExpression . Tuve que cambiar la primera línea de código a la siguiente antes de poder agregar todas mis propiedades usando lambdas:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
Todas las propiedades son tipos ''simples'', es decir, cadena, DateTime, int, bool, etc. en un objeto comercial de POCO. Están decorados con varios atributos variables de DataAnnotations .
¿Qué causa que algunas de las lambdas en mi ejemplo produzcan valores de MemberExpression y otros valores de UnaryExpression ? 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 .