C# - 如何使用 Select LINQ 方法使用动态属性列表中的属性

C# - How to use Select LINQ method using properties from a dynamically list of properties

假设我们有一个名为 Person 的简单 class,其属性为 FirstName, LastName, Age

现在我有一个属性列表作为字符串列表。

var props = new List<string> { "FirstName", "Age"}.

现在我有 ListPerson 个对象。

var persons = new List<Person> {....}

如何使用 Select LINQ 方法只获取 props 中出现的 Person 属性?

var result = persons.Select(p => code here)

结果应为匿名对象列表,其中匿名对象应包含 props 列表中的属性。

你能试试这个吗:

IEnumerable<string> personProps = typeof(Person).GetProperties().Select(p => p.Name);

List<string> props = new List<string> { "FirstName", "Age"};

IEnumerable<string> selectedProps = props.Where(p => personProps.Contains(p));

如果我答对了你的问题,你想要 trim 你的 Person 对象。 如果那是正确的,我建议在你的 Person class 中创建一个实例方法,让你有机会创建一个未命名的对象或元组(例如像这里:) directly from your Person instanciated object. You just need to pass your props List for matching the properties (like here: enter link description here),然后就使用它Select 语句中的方法。

试试这个代码。它已在 Visual Studio 中测试并正常工作

var props = new List<string> { "FirstName", "Age" };

var persons = new List<Person> { 
                  new Person { FirstName = "FirstName1", LastName = "FirstName1", Age=10},
                  new Person { FirstName = "FirstName2", LastName = "FirstName2", Age=20},
                  new Person { FirstName = "FirstName3", LastName = "FirstName3", Age=30}
    
    };

    var json = Newtonsoft.Json.JsonConvert.SerializeObject(persons);
    var jArray = JArray.Parse(json);

    List<JObject> list = new List<JObject>();

    foreach (var item in jArray)
    {
        JObject jsonObj = new JObject();
        foreach (var prop in props)
        {
            foreach (JProperty jprop in item)
            {
                if (jprop.Name == prop)
                    jsonObj.Add(jprop);
            }
        }

        list.Add(jsonObj);
    }

json = JsonConvert.SerializeObject(jsonList);

要使用它,您可以转换为字典,例如

var dictArray = JsonConvert.DeserializeObject<Dictionary<string, object>[]>(json);

或元组列表或键值对

List<(string,object)> values = dictArray.SelectMany(i=>i).Select(i =>(i.Key,i.Value)).ToList();

输出

    FirstName   FirstName1
    Age         10
    FirstName   FirstName2
    Age         20
    FirstName   FirstName3
    Age         30

或者您可以转换为动态对象

dynamic eo = dictArray.Select( e=> e.Aggregate(new ExpandoObject() as IDictionary<string, Object>,
                                (a, p) => { a.Add(p.Key, p.Value); return a; })).ToList();

测试

var firstName = eo[1].FirstName; //FirstName2

class

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}