【发布时间】:2015-08-15 03:32:51
【问题描述】:
我的方法接收所有 DataTables 参数以按单击的列对表进行排序。我从每个页面列表的控制器调用此方法。 我正在寻找一种更好的方法来执行此操作,例如适用于所有类型的通用方法:string、int、decimal、double 、bool(可为空或不可)。但我找不到。
我当前的代码:
public List<T> OrderingList<T>(List<T> list, DataTablesParam model)
{
var iColumn = model.Order.FirstOrDefault().Column;
var property = typeof(T).GetProperty(model.Columns.ToArray()[iColumn].Data);
var param = Expression.Parameter(typeof(T));
var final = Expression.Property(param, property);
var isDirAsc = model.Order.FirstOrDefault().Dir.Equals("asc");
if (property.PropertyType == typeof(string))
{
var lambda = Expression.Lambda<Func<T, string>>(final, param).Compile();
return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}
else if (property.PropertyType == typeof(int))
{
var lambda = Expression.Lambda<Func<T, int>>(final, param).Compile();
return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}
else if (property.PropertyType == typeof(bool))
{
var lambda = Expression.Lambda<Func<T, bool>>(final, param).Compile();
return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}
else if (property.PropertyType == typeof(decimal))
{
var lambda = Expression.Lambda<Func<T, decimal>>(final, param).Compile();
return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}
else if (property.PropertyType == typeof(double))
{
var lambda = Expression.Lambda<Func<T, double>>(final, param).Compile();
return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}
return list;
}
我想做这样的事情:(但是这段代码不起作用)
public List<T> OrderingList<T>(List<T> list, DataTablesParam model)
{
var iColumn = model.Order.FirstOrDefault().Column;
var property = typeof(T).GetProperty(model.Columns.ToArray()[iColumn].Data);
var param = Expression.Parameter(typeof(T));
var final = Expression.Property(param, property);
var isDirAsc = model.Order.FirstOrDefault().Dir.Equals("asc");
var lambda = Expression.Lambda<Func<T, dynamic>>(final, param).Compile();
return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}
【问题讨论】:
-
为什么不提供一个 lambda 来获取排序属性并使用
IComparer<T>进行比较? -
你基本上会使用这个现有的方法:msdn.microsoft.com/en-us/library/vstudio/… -
list.OrderBy(item => item.SomeProperty, Comparer<PropertyType>.Default);- 你可以创建一个默认提供比较器的方法。 -
可能创建另一个通用方法 CreateLambda
返回 Expression.Lamda 。然后,您可以通过反射获取此 CreateLambda 的 MethodInfo 并将其转换为您的 TIn 和 Tout。
标签: c# generics reflection expression func