如何从 select 列表中仅根据 属性 名称列表中的某些属性?

How to select from the list only some properties depending from list of property names?

我正在寻找结果是匿名但属性是从字符串列表中给出的选择

例子

public class A{
     public string PropertyA {get; set;}
     public double PropertyB {get; set;}
     public double PropertyC {get; set;}
     public double PropertyD {get; set;}
}

var list = new List<A>{ ... };

var propertyNames = new List<string>{"PropertyA", "PropertyD"}

我想创建一个 选择器,它使用 PropertyA 和 PropertyD 创建一个匿名的,这样我就可以得到类似

的东西
var result = list.Select( selector(propertynames) ).ToList();

result[0] 再次是匿名的,具有 result[0].PropertyA 和 result[0].PropertyD

等属性

我真的,真的建议对此采取不同的做法。
但是,这是解决此问题的一种方法 - 使用 System.Dynamic.ExpandoObject:

var result = list
    .Select(i =>
    {
        var expando = new ExpandoObject();
        var expandoAsDict = (IDictionary<string, object>)expando;
        var targetProperties = i
            .GetType()
            .GetProperties()
            .Where(p => propertyNames.Contains(p.Name))
            .ToDictionary(p => p.Name, p => p.GetValue(i));
        foreach (var property in targetProperties)
        {
            expandoAsDict.Add(property);
        }
        return (dynamic)expando;
    })
    .ToList();

然后您可以按照您的描述进行操作,例如:

Console.WriteLine(result[0].PropertyA);

写出期望值。

当然,您可以忘记对动态类型的 Intellisense 支持(如果一开始这不是很明显的话)。
注意:另一种方法是在运行时使用 System.Reflection.Emit 构造您的类型,但这会更加尴尬。

祝你好运!