我有一个我们使用的Generic Sort方法,需要扩展它以便能够对不同类型的列表进行排序。
当我传入一个列表时,构建sortExpression的代码不会起作用,因为列表项是继承的,因此父类型反映在T中,而不是传递给o的实际类型。
任何想法如何使用传递的类型工作?
public static List<T> Sort<T>(IQueryable<T> list, int sortOrder, string sortColumn, Type o)
{
var param = Expression.Parameter(o);
MemberExpression sortProperty = Expression.Property(param, sortColumn);
String propertyType = o.GetProperty(sortColumn).PropertyType.ToString();
switch (propertyType)
{
case "System.String":
{
var sortExpression = Expression.Lambda<Func<T, String>>(sortProperty, param);
return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList();
}
case "System.Int32":
{
var sortExpression = Expression.Lambda<Func<T, Int32>>(sortProperty, param);
return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList();
}
case "System.Decimal":
{
var sortExpression = Expression.Lambda<Func<T, Decimal>>(sortProperty, param);
return sortOrder == 0 ? list.OrderBy(sortExpression).ToList() : list.OrderByDescending(sortExpression).ToList();
}
// etc...
}
}
答案 0 :(得分:1)
如有必要,您可以使用Expression.Convert()
,并且可以使用list.ElementType
获取IQueryable中元素的类型。
例如:
public static List<T> Sort<T>(IQueryable<T> list, int sortOrder, string sortColumn, Type o)
{
var param = Expression.Parameter(list.ElementType);
MemberExpression sortProperty = Expression.Property(Expression.Convert(param, o), sortColumn);
// etc...
答案 1 :(得分:0)
尝试将PropertyType作为Expression.Lambda()
中的第一个参数发送