我要做的是这段代码
filtered = GetUserList().OrderBy(p => p.Name).ToList();
以通用方式
public static List<T> sortBy<T>(string field, List<T>list)
{
//list.OrderBy(p=>p.Equals(field)).ToList();
//list = list.OrderBy(p => p.GetType().GetProperties().ToList().Find(d => d.Name.Equals(field))).ToList();
return list;
}
有什么建议吗?
答案 0 :(得分:2)
如果这是您的唯一要求,快速方式(而不是我链接的更复杂的方法)将通过反射访问属性。此扩展方法将为您提供所需内容:
public static class EnumerablePropertyAccessorExtensions
{
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property)
{
return enumerable.OrderBy(x => GetProperty(x, property));
}
private static object GetProperty(object o, string propertyName)
{
return o.GetType().GetProperty(propertyName).GetValue(o, null);
}
}
或者(稍微优化)像这样:
public static class EnumerablePropertyAccessorExtensions
{
public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property)
{
var prop = typeof(T).GetProperty(property);
return enumerable.OrderBy(x => GetProperty(x, prop));
}
private static object GetProperty(object o, PropertyInfo property)
{
return property.GetValue(o, null);
}
}
然后可以在任何IEnumerable<>
上调用此扩展方法,如下所示:
filtered = GetUserList().OrderBy("Name").ToList();
但请注意,此实现并未真正优化或防错。如果这是你需要的,你可能想要达到目的。