我构建了一个框架,允许根据主排序列对表中的报告数据进行级联排序。它在大多数情况下都有效,除了一种特定但重要的情况:当字段的属性是值类型时。我收到以下错误消息:
System.ArgumentException:“System.Int32”类型的表达式不能用于返回类型“System.Object”
我知道这意味着我需要对 ValueType 的值进行装箱,但我不完全确定在这种特殊情况下如何操作。根据一些研究和这个答案 https://stackoverflow.com/a/20745242/2359643我相信我需要使用Expression.Convert https://msdn.microsoft.com/en-us/library/bb292051(v=vs.110).aspx某种程度上来说。
我下面的代码是生成表达式的。泛型类型参数 T 是数据“行”的类型。这GetFullSortOrder()
只是返回一个字符串数组,该数组表示也将被排序的类型 T 中的列(属性)的名称。
public IEnumerable<Expression<Func<T, object>>> GetExpressions<T>(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<T, object>>(propParameter, typeParameter);
}
}
处理时抛出异常Expression.Lambda<Func<T, object>>()
当T中选择的Property是ValueType时。当类型直到运行时才知道时,属性框需要什么或返回正确的值?
你说过了 - 你需要使用Expression.Convert https://msdn.microsoft.com/en-us/library/bb292051(v=vs.110).aspx并通过typeof(object)
。如果您想模拟 C# 编译器的功能,则应该仅针对值类型执行此操作:
Expression result = propParameter;
if (typeof(T).IsValueType)
result = Expression.Convert(result, typeof(object));
yield return Expression.Lambda<Func<T, object>>(result, typeParameter);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)