我有一份清单object.如何使用属性名称订购此列表?
string orderbyField = "Code";
List<object> l = FillList();
l = l.OrderBy(o => orderbyField);
Run Code Online (Sandbox Code Playgroud)
我可以为此问题进行扩展吗?
Ere*_*mez 17
如果您不必将属性名称作为字符串提供,则使用dynamic以下内容非常简单:
List<object> l = FillList();
l = l.OrderBy(o => ((dynamic)o).Id);
Run Code Online (Sandbox Code Playgroud)
如果属性名称必须是一个字符串,那么它会变得有点复杂,但可以使用反射完成(虽然效率不高):
l = l.OrderBy(o => o.GetType()
.GetProperty("Code")
.GetValue(o, null));
Run Code Online (Sandbox Code Playgroud)
您还应该考虑添加一些错误处理,例如,如果该属性不存在.
此外,如果列表中的所有元素具有相同的运行时类型,那么使用表达式树重新编译getter函数并重用它(而不是直接使用反射)会更有效.
public static Func<object, object> CreateGetter(Type runtimeType, string propertyName)
{
var propertyInfo = runtimeType.GetProperty(propertyName);
// create a parameter (object obj)
var obj = Expression.Parameter(typeof(object), "obj");
// cast obj to runtimeType
var objT = Expression.TypeAs(obj, runtimeType);
// property accessor
var property = Expression.Property(objT, propertyInfo);
var convert = Expression.TypeAs(property, typeof(object));
return (Func<object, object>)Expression.Lambda(convert, obj).Compile();
}
Run Code Online (Sandbox Code Playgroud)
并使用它像:
var codeGetter = CreateGetter(l[0].GetType(), "Code"); // using the 1st element as an example
l = l.OrderBy(o => codeGetter(o));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7945 次 |
| 最近记录: |