C# 如何使用LINQ的Select方法按动态属性列表选取指定属性
首先明确:C#的匿名类型属于静态类型,结构必须在编译阶段确定,所以如果你的属性列表props是只有运行时才能知道内容的动态列表,无法直接生成符合要求的匿名对象列表,我们可以用动态类型实现同等使用效果。
场景1:props列表内容编译时可确定
如果你的props是固定值(比如示例中固定就是FirstName和Age两个属性),直接手动构造匿名对象即可,这是性能最优、最简单的方案:
var result = persons.Select(p => new { p.FirstName, p.Age }).ToList();
场景2:props列表运行时动态变化
如果props的内容是运行时动态传入的,需要按字符串动态读取属性,我们可以通过反射结合ExpandoObject实现:
var result = persons.Select(p => { // 用ExpandoObject存储动态属性 dynamic dynamicObj = new ExpandoObject(); var propertyDict = dynamicObj as IDictionary<string, object>; foreach (var propName in props) { // 反射获取Person对应属性的值 var property = typeof(Person).GetProperty(propName); if (property != null) { propertyDict[propName] = property.GetValue(p); } } return dynamicObj; }).ToList();
说明
返回的结果是List<dynamic>类型,你可以像访问普通对象一样直接读取属性值,比如var name = result[0].FirstName完全可以正常执行,符合使用需求。
内容的提问来源于stack exchange,提问作者Mihai Alexandru-Ionut
相关产品推荐
相关产品推荐

