Problemas de generación de expresiones dinámicas con ValueTypes

Construí un marco que permite la clasificación en cascada de los datos del informe en una tabla dependiendo de qué columna es la columna ordenada maestra. Funciona en su mayor parte, excepto en un caso específico, pero importante: cuando la propiedad del campo es un tipo de valor. Recibo el siguiente mensaje de error:

System.ArgumentException: la expresión del tipo ‘System.Int32’ no se puede usar para el tipo de devolución ‘System.Object’

Sé que esto significa que debo recortar el valor del ValueType, pero no estoy completamente seguro de cómo hacerlo en esta situación particular. Según algunas investigaciones y esta respuesta , creo que necesito usar Expression.Convert de alguna manera.

Mi código de abajo es lo que genera las expresiones. El parámetro de tipo genérico T es el tipo de la “fila” de datos. GetFullSortOrder() simplemente devuelve una matriz de cadenas que representan los nombres de las columnas (propiedades) en el tipo T que también se ordenarán.

 public IEnumerable<Expression<Func>> GetExpressions(string sortedColumn) where T : IReportRecord { var columns = GetFullSortOrder(sortedColumn) var typeParameter = Expression.Parameter(typeof(T)); foreach (var c in columns) { var propParameter = Expression.Property(typeParameter, c); yield return Expression.Lambda<Func>(propParameter, typeParameter); } } 

La excepción se produce cuando se procesa Expression.Lambda<Func>() cuando la propiedad seleccionada en T es de un ValueType. ¿Qué se necesita para el cuadro de propiedad o devolver el valor correcto cuando los tipos no se conocen hasta el tiempo de ejecución?

Lo dijo: necesita usar Expression.Convert y pasar typeof(object) . Si desea simular lo que hace el comstackdor de C #, debe hacerlo solo para los tipos de valor:

 Expression result = propParameter; if (typeof(T).IsValueType) result = Expression.Convert(result, typeof(object)); yield return Expression.Lambda>(result, typeParameter); 

Tienes que convertir tu propiedad Expression a un tipo de objeto:

 var propParameterObj = Expression.Convert(propParameter, typeof(object));