C# 使用属性名称生成OrderBy表达式

C# 使用属性名称生成OrderBy表达式,c#,asp.net-mvc,reflection,expression-trees,C#,Asp.net Mvc,Reflection,Expression Trees,我试图通过MVC3中的WebGrid控件支持排序,该控件通过sort参数将模型上的属性名称传递到我的操作中 public class Agent { public int Id { get; set; } public string Name { get; set; } } [HttpGet] public ActionResult Index(string sort = "Id", string sortdir = "ASC") { // Define the pa

我试图通过MVC3中的
WebGrid
控件支持排序,该控件通过
sort
参数将模型上的属性名称传递到我的操作中

public class Agent {
    public int Id { get; set; }
    public string Name { get; set; }
}

[HttpGet]
public ActionResult Index(string sort = "Id", string sortdir = "ASC") {

    // Define the parameter that we are going to use in the OrderBy clause.
    var param = Expression.Parameter(typeof(Agent), "agent");

    // Now we'll make our lambda function that returns the
    // property's value by it's name.
    var sortExpression = Expression.Lambda<Func<Agent, object>>(Expression.Property(param, sort), param);

    var agents = entities.OrderBy(sortExpression).ToList();

    var model = new PagedResult<Agent> {

        CurrentPage = 1,
        PageCount = 1,
        PageSize = DefaultPageSize,
        Results = agents,
        RowCount = agents.Count

    };

    return View(model);
}
公共类代理{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
[HttpGet]
公共操作结果索引(string sort=“Id”,string sortdir=“ASC”){
//定义我们将在OrderBy子句中使用的参数。
var param=表达式参数(类型为(代理),“代理”);
//现在我们将生成lambda函数,该函数返回
//属性的名称的值。
var sortExpression=Expression.Lambda(Expression.Property(param,sort),param);
var agents=entities.OrderBy(sortExpression.ToList();
var模型=新页面结果{
CurrentPage=1,
PageCount=1,
PageSize=DefaultPageSize,
结果=代理,
RowCount=agents.Count
};
返回视图(模型);
}

当我尝试按
Name
属性对模型进行排序时,此代码起作用,该属性的类型为
string
。但是,如果我尝试按
Id
排序,我会收到类型为'System.Int32'的错误
表达式不能用于返回类型'System.Object'
您可以使用
Expression.Convert
来执行装箱。

您是否尝试过使用Expression.Convert,如图所示:我刚刚使用
Expression.TypeAs
使它工作。我还不知道两者之间的区别是什么,但是如果你想把它作为一个答案提交给我,我将非常乐意给你信任。很高兴你的问题得到了解决。我也不知道两者的区别是什么!