表达式中的非特定类型。Lambda泛型

4
以下代码可以正常工作(构建通用的OrderBy):
public class Item
{
    public int Value { get; set; }
    public string Name { get; set; }
}

var _List = new List<Item>
{
    new Item{ Name = "Smith", Value = 3},
    new Item{ Name = "Smith", Value = 2},
    new Item{ Name = "Wesson", Value = 1},
    new Item{ Name = "Wesson", Value = 4},
}.AsQueryable<Item>();

var _Type = typeof(Item);

// OrderBy
var _OrderByProperty = _Type.GetProperty("Value");
var _OrderByParameter = Expression.Parameter(typeof(Item), "x");
// OrderBy(x => x.Value)
var _OrderByBody = Expression.Property(_OrderByParameter, _OrderByProperty.Name);
var _OrderByLambda = Expression.Lambda<Func<Item, Int32>>
    (_OrderByBody, _OrderByParameter);
// apply the OrderBy
_List = _List.OrderBy(_OrderByLambda);

但是,我想以这种方式更改此行:

var _OrderByLambda = Expression.Lambda<Func<Item, object>>
    (_OrderByBody, _OrderByParameter);

这样的更改将使有序列的数据类型成为通用型。但这样的更改会导致以下异常:
“无法将类型为'System.Int32'的表达式用于返回类型'System.Object'”
有什么想法吗?
编辑,感谢您的回答,这很好用:
var _OrderByProperty = _Type.GetProperty("Value");
var _OrderByParameter = Expression.Parameter(typeof(Item), "x");
// OrderBy(x => x.Value)
var _OrderByBody = Expression.Property(_OrderByParameter, _OrderByProperty.Name);
var _OrderByConverted = Expression.Convert(_OrderByBody, typeof(object));
var _OrderByLambda = Expression.Lambda<Func<Item, object>>
    (_OrderByConverted, _OrderByParameter);
// apply the OrderBy
_List = _List.OrderBy(_OrderByLambda);
3个回答

6

您需要指定返回体的类型为 System.Object。您可以通过插入一个类型转换来实现这一点(C#会自动隐式完成):

_OrderByBody = Expression.Convert(_OrderByBody, typeof(object));

1
问题在于Expression.Property(_OrderByParameter, _OrderByProperty.Name);创建了一个返回int的表达式。您需要将其装箱。因此,您需要将其包装在Box表达式中。但是,如果您想使其通用,则不应该装箱对象。

0

问题出在这一行:

_List = _List.OrderBy(_OrderByLambda);

这个方法需要 Function<Item, int> 参数(因为 _Type.GetProperty("Value") 返回的是 Int32),所以你不能使用 Expression.Lambda<Func<Item, object>> 类型。

如果你需要 object 泛型函数,那么你必须将你的类定义更改为:

public class Item
{
    public object Value { get; set; }
    public string Name { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接