gpt4 book ai didi

c# - ValueType 的动态表达式生成问题

转载 作者:行者123 更新时间:2023-11-30 15:19:28 25 4
gpt4 key购买 nike

我构建了一个框架,该框架允许根据哪个列是主排序列对表中的报告数据进行级联排序。它在大多数情况下都有效,但在一个特定但重要的情况下除外:当字段的属性是值类型时。我收到以下错误消息:

System.ArgumentException: Expression of type 'System.Int32' cannot be used for return type 'System.Object'

我知道这意味着我需要装箱 ValueType 的值,但我不完全确定在这种特定情况下该怎么做。根据一些研究和 this SO answer我相信我需要使用 Expression.Convert 某种程度上来说。

我下面的代码是生成表达式的代码。通用类型参数 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 中选择的属性属于 ValueType 时。当类型直到运行时才知道时,属性框或返回正确值需要什么?

最佳答案

你说了 - 你需要使用 Expression.Convert并传递 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);

关于c# - ValueType 的动态表达式生成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com