使用字符串作为Linq查询的属性

4

可能是重复问题:
LINQ: 使用动态字符串参数进行排序

我正在使用 OrderBy() 子句对 IEnumarable 进行排序。我有一个包含我想要按其排序的字段值的字符串列表。现在,我正在为每个属性名称使用 switch 语句。

  swich (propertyname)
    case "name":
      list = list.OrderBy(l=>l.name).ToList();
      break;
    case "property":
      list = list.OrderBy(l=>l.property).ToList();
      .....

有没有一种简单的解决方案可以在orderby子句中将字符串“propertyname”用作属性?

我已经尝试了一个解决方案,但它离理想状态还很远。不仅编写每个属性需要更多的工作量,而且如果在将来添加任何属性,则会忘记更新我正在编写的函数。

希望有人有更好的解决方案。

2个回答

3
var list = new List<MyClass>();

// Gets an object to give us access to the property with the given name of type MyClass
var propertyInfo = typeof(MyClass).GetProperty(propertyName);

// Each item is ordered by the value of the property
list = list.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();

解释谓词:
var xPropVal = propertyInfo.GetValue(x, null);

使用属性信息对象,您可以获取具有空参数的对象x的值。在这种情况下,参数将用于索引器,因为这是一个属性信息对象。
但由于在这种情况下属性都是简单属性,第二个参数应该为null或空对象数组。

但是如果属性名称有更多的变体,会怎么样呢? - Likurg
这不是被问到的内容。该字符串是属性的名称,可能会有多个而不仅仅是2个。 - yamen
这个问题意味着有超过两个属性。请注意末尾的省略号。 - Stilgar
使用反射机制编辑以支持多个属性。 - SimpleVar
@YoryeNathan,你能为我解释一下 'propertyInfo.GetValue(x, null)' 这段代码吗? - Likurg
@Likurg 如果需要更多解释,请告诉我。 - SimpleVar

1

你看过@dash的评论了吗? - Likurg
是的,我同意他的观点,但那时候我已经写完了我的帖子 :) - samjudson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接