【发布时间】:2012-08-01 12:37:25
【问题描述】:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI.WebControls;
using dynamic = System.Linq.Dynamic;
using System.Linq.Expressions;
namespace Project.Lib.Extensions
{
public static partial class Utils
{
public static List<T> SortForMe<T>(this List<T> list, string propertyName,SortDirection sortDirection)
{
string exp1 = string.Format("model.{0}", propertyName);
var p1 = Expression.Parameter(typeof(T), "model");
var e1 = dynamic.DynamicExpression.ParseLambda(new[] { p1 }, null, exp1);
if (e1 != null)
{
if (sortDirection==SortDirection.Ascending)
{
var result = list.OrderBy((Func<T, object>)e1.Compile()).ToList();
return result;
}
else
{
var result = list.OrderByDescending((Func<T, object>)e1.Compile()).ToList();
return result;
}
}
return list;
}
}
}
我正在使用此代码按属性名称对我的通用列表进行排序。当属性类型为string时,此代码运行成功,但当属性类型为long或int时,出现此异常:
无法转换类型的对象 'System.Func`2[Project.Lib.Model.UserQueryCount,System.Int64]' 输入 'System.Func`2[Project.Lib.Model.UserQueryCount,System.Object]'。
var result = list.OrderBy((Func<T, dyamic>)e1.Compile()).ToList();
在上面一行中,我决定使用dynamic,但又遇到了异常。我该怎么办?
我这样改变了我的方法:
public static List<TModel> SortForMe<TModel>(this List<TModel> list, string propertyName,SortDirection sortDirection) where TModel:class
{
var ins = Activator.CreateInstance<TModel>();
var prop= ins.GetType().GetProperty(propertyName);
var propertyType = prop.PropertyType;
string exp1 = string.Format("model.{0}", propertyName);
var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TModel), "model");
var e1 = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p1 }, null, exp1);
if (e1 != null)
{
if (sortDirection==SortDirection.Ascending)
{
return list.OrderBy((Func<TModel, propertyType>)e1.Compile()).ToList();
}
return list.OrderByDescending((Func<TModel, propertyType>)e1.Compile()).ToList();
}
return list;
}
我使用反射获得了 propertyType,但在 Func 中我不能像这样使用它:"Func<TModel, propertyType>" 有什么办法可以解决这个问题
感谢您的帮助。
【问题讨论】:
-
没有时间去寻找错误,但你应该可以从这里窃取大部分 lambda 代码:stackoverflow.com/questions/41244/dynamic-linq-orderby - 非常相似的问题
-
另外,
using dynamic = System.Linq.Dynamic;真的很混乱;dynamic是上下文关键字;强烈建议您选择另一个别名...或者根本不使用别名 -
"使用动态 = System.Linq.Dynamic;"我删除了这个。我改变了“var e1 = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p1 }, null, exp1);”感谢您的建议
标签: c# linq reflection dynamic