c# – 按属性名称(字符串值)排序列表?

前端之家收集整理的这篇文章主要介绍了c# – 按属性名称(字符串值)排序列表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个对象列表.如何使用属性名称订购此列表?
string orderbyField = "Code";
List<object> l = FillList();
l = l.OrderBy(o => orderbyField);

我可以为此问题进行扩展吗?

解决方法

如果您不必将属性名称作为字符串提供,则使用动态非常简单:
List<object> l = FillList();
l = l.OrderBy(o => ((dynamic)o).Id);

如果属性名称必须是一个字符串,那么它会变得有点复杂,但可以使用反射完成(虽然效率不高):

l = l.OrderBy(o => o.GetType()
                    .GetProperty("Code")
                    .GetValue(o,null));

您还应该考虑添加一些错误处理,例如如果财产不存在.

此外,如果列表中的所有元素具有相同的运行时类型,那么使用表达式树重新编译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();
}

并使用它像:

var codeGetter = CreateGetter(l[0].GetType(),"Code"); // using the 1st element as an example
l = l.OrderBy(o => codeGetter(o));

猜你在找的C#相关文章