ValueTypes的动态表达式生成问题

我构建了一个框架,允许对表中的报表数据进行级联排序,具体取决于哪个列是主排序列。 它在很大程度上起作用,除了一个特定但重要的情况:当字段的属性是值类型时。 我收到以下错误消息:

System.ArgumentException:类型’System.Int32’的表达式不能用于返回类型’System.Object’

我知道这意味着我需要设置ValueType的值,但我不完全确定如何在这种特殊情况下。 根据一些研究和这个SO答案,我认为我需要以某种方式使用Expression.Convert

我的代码是生成表达式的代码。 generics类型参数T是数据“行”的类型。 GetFullSortOrder()只返回一个字符串数组,这些字符串表示类型T中也将进行排序的列(属性)的名称。

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

当在T中选择的属性是ValueType时处理Expression.Lambda<Func>()时抛出exception。 属性框需要什么,或者在运行时才知道类型时返回正确的值?

你说过 – 你需要使用Expression.Convert并传递typeof(object) 。 如果要模拟C#编译器的function,则应仅对值类型执行此操作:

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

您必须将属性Expression转换为对象类型:

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