Linq通过变量访问属性

假设我有一个类:

public class Foo { public string Title {get;set;} } 

现在,让我们假设我有一个public List myList ,我希望Linq过滤它:

 var x = myList.Where(f => f.Title == myValue); 

到目前为止,一切都很美好。

但是如何通过变量访问属性? 就像是:

 string myProperty = "Title"; var x = myList.Where(f => f.myProperty == myValue); 

您可以编写扩展方法

 public static class MyExtensions { public static object GetProperty(this T obj, string name) where T : class { Type t = typeof(T); return t.GetProperty(name).GetValue(obj, null); } } 

并像这样使用它

 var x = myList.Where(f => f.GetProperty("Title") == myValue); 

这不是LINQ用于的情况类型。 LINQ是一个用于操作集合的流畅界面。 通过文本表示访问成员是通过reflection完成的。

 object GetProperty(Foo f, string propertyName) { var type = typeof(Foo); var propInfo = type.GetProperty(propertyName); return propInfo.GetValue(f, null); } 

如果您需要动态地动态编写查询,可以使用LINQ Dynamic Query库,这是Microsoft的一个示例:

此示例显示了一种在运行时动态编写LINQ语句的技术。

在代码中引用库:

 using System.Linq.Dynamic; 

您的查询将如下所示:

 // You can use a string as the argument for the Where method // meaning you can compose this string dynamically string myProperty = "Title"; var x = myList.Where(myProperty + " = " + myValue); 

也可以在查询字符串中使用占位符,从而提高可读性(在某种程度上):

 var x = myList.Where("@0 = @1", myProperty, myValue); 

另请参阅Scott Guthrie的这篇文章:动态LINQ第1部分: 使用LINQ动态查询库 ( 我认为没有第2部分……

注意:您必须编译Microsoft的示例代码并引用构建的程序集,或者您可以将代码包含在您自己的项目中。

我知道这是一个旧线程,但这是另一种方法。 如果您需要在循环中执行此操作,则具有显着更快的优点。 我已经将结果从“func”转换为对象,使其更具通用性。

  var p = Expression.Parameter(typeof(string)); var prop = Expression.Property(p, "Length"); var con = Expression.Convert(prop, typeof(object)); var exp = Expression.Lambda(con, p); var func = (Func)exp.Compile(); var obj = "ABC"; int len = (int)func(obj); 

在最初的问题中,代码在linq中使用,因此速度可能很好。 如果构造正确,也可以在where子句中使用“func”direct,例如

  class ABC { public string Name { get; set; } } var p = Expression.Parameter(typeof(ABC)); var prop = Expression.Property(p, "Name"); var body = Expression.Equal(prop, Expression.Constant("Bob")); var exp = Expression.Lambda(body, p); var func = (Func)exp.Compile(); ABC[] items = "Fred,Bob,Mary,Jane,Bob".Split(',').Select(s => new ABC() { Name = s }).ToArray(); ABC[] bobs = items.Where(func).ToArray(); 

你不能使用来自microsoft的 linq 动态查询这里是示例代码

  var query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). OrderBy("CompanyName"). Select("New(CompanyName as Name, Phone)");