使用string作为linq查询的属性

时间:2012-05-02 11:36:14

标签: c#

  

可能重复:
  LINQ: orderby with dynamic string parameter

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

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

是否有一个简单的解决方案,使用字符串“propertyname”作为orderby子句中的属性?

正如我所做的那样,我得到了一个远非理想的解决方案。编写每个属性不仅更有效,而且如果将来添加任何属性,这个更新将被遗忘在我正在编写的函数中。

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

2 个答案:

答案 0 :(得分: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);

使用属性info对象,可以获得对象x的值,并带有null参数。 在这种情况下,参数将用于索引器,因为这是属性信息对象。

但由于这种情况下的属性都是简单属性,因此第二个参数应为null或空对象数组。

答案 1 :(得分:1)

最简单的方法是查看Microsoft提供的Dynamic Linq示例。 Scott Guthrie在这里有一篇关于它的博客文章:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

你可以这样做:

string propertyname = ...
list.OrderBy(propertyname).ToList();