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

标签 c# linq

<分区>

我有一个对象列表。我如何使用属性名称对该列表进行排序?

string orderbyField = "Code";
List<object> l = FillList();
l = l.OrderBy(o => orderbyField);

我可以扩展这个问题吗?

最佳答案

如果您不必以字符串形式提供属性名称,使用 dynamic 非常简单:

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# - 按属性名称(字符串值)排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26646249/

相关文章:

c# - 更改xamarin android中的日期格式

c# - Azure 函数 - 我们什么时候需要使用 out 进行输出绑定(bind)?

c# - WebMethod 在参数中接收 null

C#: double 的 Array.Sort 方法?

c# - 如何生成具有 Name 属性而不是 Id 的链接

c# - 如何将字典的内容写入文本文件?

c# - 如何在 C# 中使用反射找到所有实现通用抽象类的类?

c# - LINQ:如何跳过一个然后获取序列的其余部分

c# - ConcurrentDictionary.Where 对于基于 int 数组(键字段)的过滤非常慢

c# - linq 和数据表的困难