LinQ中的动态列名称

use*_*418 7 linq list dynamic

我正在上课.

class Item{
        public int Id { get; set; }
        public DateTime CreatedDate { get; set; } 
        public string Name { get; set; }
        public string Description { get; set;}
    }
Run Code Online (Sandbox Code Playgroud)

我想根据动态列名过滤项目列表.假设我想要Names列表,那么Column Name是"Name",结果将是名称列表如果列名是Description,我需要描述列表.

如何使用LinQ执行此操作?

Abb*_*bas 14

简单,只需从列表中选择您需要的属性:

var items = new List<Item>();
//get names
var names = items.Select(x => x.Name);
//get descriptions
var descriptions = items.Select(x => x.Description);
Run Code Online (Sandbox Code Playgroud)

更新:

你需要做一些反思才能做到这一点:

var names = items.Select(x => x.GetType().GetProperty("Name").GetValue(x));
Run Code Online (Sandbox Code Playgroud)

把它放在一个可重用的方法中:

public IEnumerable<object> GetColumn(List<Item> items, string columnName)
{
    var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x));
    return values;
}
Run Code Online (Sandbox Code Playgroud)

当然,这不会验证列中是否存在列.所以NullReferenceException当它没有的时候会扔掉它.它返回一个IEnumerable<object>,所以你必须ToString()在之后调用每个对象来获取值,或者ToString()在之后调用查询GetValue(x):

public IEnumerable<string> GetColumn(List<Item> items, string columnName)
{
    var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x).ToString());
    return values;
}
Run Code Online (Sandbox Code Playgroud)

用法:

var items = new List<Item>(); //fill it up
var result = GetColumn(items, "Name");
Run Code Online (Sandbox Code Playgroud)