如何在lambda表达式中按字符串属性名进行选择查询?

我想使用lambda select进行查询,

如下所示:

public class Foo{ public int Id {get;set;} public string Name {get;set;} public string Surname {get;set;} } var list = new List(); var temp = list.Select(x=> x("Name"),("Surname")); 

属性名称需要作为字符串发送,我不知道如何使用,我已经将它作为一个例子。 可能吗?

编辑:

 Foo list : 1 AB 2 CD 3 EF 4 GH 

我不知道通用列表的类型,我有属性名称,如“姓名”,“姓”

我希望如下:

 Result : AB CD EF GH 

以下代码段显示了2个案例。 一个过滤列表,另一个创建一个新的匿名对象列表,只有Name和Surname。

 List list = new List(); var newList = list.Select(x=> new { AnyName1 = x.Name, AnyName2 = x.Surname }); var filteredList = list.Select(x => x.Name == "FilteredName" && x.Surname == "FilteredSurname"); var filteredListByLinq = from cust in list where cust.Name == "Name" && cust.Surname == "Surname" select cust; var filteredByUsingReflection = list.Select(c => c.GetType().GetProperty("Name").GetValue(c, null)); 
 var temp = list.Select(x => x.Name == "Name" && x.Surname == "Surname"); 

接口

如果您可以访问相关类型,并且总是希望访问相同的属性,那么最好的选择是使类型实现相同的接口:

 public interface INamable { string Name { get; } string Surname { get; } } public class Foo : INamable { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } } 

这将保留类型安全性并启用以下查询:

 public void ExtractUsingInterface(IEnumerable list) where T : INamable { var names = list.Select(o => new { Name = o.Name, Surname = o.Surname }); foreach (var n in names) { Console.WriteLine(n.Name + " " + n.Surname); } } 

如果由于某种原因,您无法更改原始类型,则还有两个选项。

reflection

第一个是反思。 这是Mez的答案,我只是将其改为匿名类型,就像之前的解决方案一样(不确定你需要什么):

 public void ExtractUsingReflection(IEnumerable list) { var names = list.Select(o => new { Name = GetStringValue(o, "Name"), Surname = GetStringValue(o, "Surname") }); foreach (var n in names) { Console.WriteLine(n.Name + " " + n.Surname); } } private static string GetStringValue(T obj, string propName) { return obj.GetType().GetProperty(propName).GetValue(obj, null) as string; } 

动态

第二个使用动态:

 public void ExtractUsingDynamic(IEnumerable list) { var dynamicList = list.Cast(); var names = dynamicList.Select(d => new { Name = d.Name, Surname = d.Surname }); foreach (var n in names) { Console.WriteLine(n.Name + " " + n.Surname); } } 

有了这个,下面的代码:

 IEnumerable list = new List { new Foo() {Id = 1, Name = "FooName1", Surname = "FooSurname1"}, new Foo() {Id = 2, Name = "FooName2", Surname = "FooSurname2"} }; ExtractUsingInterface(list); // IEnumerable list... will be fine for both solutions below ExtractUsingReflection(list); ExtractUsingDynamic(list); 

将产生预期的输出:

 FooName1 FooSurname1 FooName2 FooSurname2 FooName1 FooSurname1 FooName2 FooSurname2 FooName1 FooSurname1 FooName2 FooSurname2 

我相信你可以摆弄它并达到你想要实现的目标。

 var temp = list.Select(x => new {Name = x.Name, Surname = x.Surname});