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

C# 表达式中的非特定类型。Lambda泛型,c#,linq,sql-order-by,expression-trees,C#,Linq,Sql Order By,Expression Trees,以下代码运行良好(它构建了一个通用的OrderBy): 公共类项目 { 公共int值{get;set;} 公共字符串名称{get;set;} } var_List=新列表 { 新项目{Name=“Smith”,值=3}, 新项目{Name=“Smith”,值=2}, 新项{Name=“Wesson”,值=1}, 新项目{Name=“Wesson”,值=4}, }.AsQueryable(); 变量类型=类型(项目); //订货人 var_OrderByProperty=_Type.GetProp

以下代码运行良好(它构建了一个通用的OrderBy):

公共类项目
{
公共int值{get;set;}
公共字符串名称{get;set;}
}
var_List=新列表
{
新项目{Name=“Smith”,值=3},
新项目{Name=“Smith”,值=2},
新项{Name=“Wesson”,值=1},
新项目{Name=“Wesson”,值=4},
}.AsQueryable();
变量类型=类型(项目);
//订货人
var_OrderByProperty=_Type.GetProperty(“值”);
var_OrderByParameter=表达式参数(项目类型),“x”);
//OrderBy(x=>x.Value)
var\u OrderByBody=Expression.Property(\u OrderByParameter,\u OrderByProperty.Name);
var_OrderByLambda=表达式.Lambda
(_OrderByBody,_OrderByParameter);
//应用OrderBy
_List=\u List.OrderBy(\u OrderByLambda);
但是,我想用这种方式改变这一行:

var _OrderByLambda = Expression.Lambda<Func<Item, object>>
    (_OrderByBody, _OrderByParameter);
var\u OrderByLambda=Expression.Lambda
(_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);
var\u OrderByProperty=\u Type.GetProperty(“Value”);
var_OrderByParameter=表达式参数(项目类型),“x”);
//OrderBy(x=>x.Value)
var\u OrderByBody=Expression.Property(\u OrderByParameter,\u OrderByProperty.Name);
var_OrderByConverted=Expression.Convert(_OrderByBody,typeof(object));
var_OrderByLambda=表达式.Lambda
(_OrderByConverted,_OrderByParameter);
//应用OrderBy
_List=\u List.OrderBy(\u OrderByLambda);

问题在于
Expression.Property(\u OrderByParameter,\u OrderByProperty.Name)创建一个返回int的表达式。您需要将其框起来。因此,您需要将其包装在一个长方体表达式中。但是,如果您想使其通用,则不应将对象装箱

问题在于这一行:

_List = _List.OrderBy(_OrderByLambda);
此方法需要
函数
参数(因为
\u Type.GetProperty(“Value”)
返回
Int32
),所以不能使用
表达式.Lambda
类型

如果需要
对象
通用函数,则必须将类定义更改为:

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

您需要指定主体的返回类型正好是
System.Object
。您可以通过插入一个转换(C#隐式执行的操作)来实现这一点:

public class Item
{
    public object Value { get; set; }
    public string Name { get; set; }
}
_OrderByBody = Expression.Convert(_OrderByBody, typeof(object));