如何通过反射在运行时筛选List<MyClass>的指定属性数据?
用反射提取指定字段数据的实现方案
完全可以通过反射实现需求,以下是具体操作步骤和代码示例:
核心思路
利用反射动态获取MyClass的公共属性,过滤出fieldsOfInterest指定的属性后,遍历源集合中的每个实例,提取对应属性的值并返回。由于返回字段是动态指定的,用Dictionary<string, object>存储每个实例的指定字段键值对是最灵活的方案。
代码实现
基础版本
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; public class FieldExtractor { public List<Dictionary<string, object>> GetSelectedFields(List<MyClass> sourceList, List<string> fieldsOfInterest) { // 获取MyClass的所有公共实例属性 var allProperties = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance); // 过滤出指定字段(忽略大小写匹配) var targetProperties = allProperties .Where(prop => fieldsOfInterest.Contains(prop.Name, StringComparer.OrdinalIgnoreCase)) .ToList(); var result = new List<Dictionary<string, object>>(); foreach (var item in sourceList) { var fieldDict = new Dictionary<string, object>(); foreach (var prop in targetProperties) { // 提取属性值并存入字典 fieldDict[prop.Name] = prop.GetValue(item); } result.Add(fieldDict); } return result; } } // 原类定义(不可修改) public class MyClass { public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } public string Phone { get; set; } public string Adrs1 { get; set; } public string Adrs2 { get; set; } }
性能优化版本(缓存属性)
如果该方法会被频繁调用,建议缓存MyClass的属性信息,避免每次调用都重复反射获取:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; public class FieldExtractor { // 静态缓存MyClass的属性字典(忽略大小写键) private static readonly Dictionary<string, PropertyInfo> _myClassPropertyCache = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance) .ToDictionary(prop => prop.Name, prop => prop, StringComparer.OrdinalIgnoreCase); public List<Dictionary<string, object>> GetSelectedFields(List<MyClass> sourceList, List<string> fieldsOfInterest) { // 过滤出存在的目标属性 var targetProperties = fieldsOfInterest .Where(field => _myClassPropertyCache.ContainsKey(field)) .Select(field => _myClassPropertyCache[field]) .ToList(); var result = new List<Dictionary<string, object>>(); foreach (var item in sourceList) { var fieldDict = new Dictionary<string, object>(); foreach (var prop in targetProperties) { fieldDict[prop.Name] = prop.GetValue(item); } result.Add(fieldDict); } return result; } }
说明
- 这里针对的是类的属性(Property),而非字段(Field),因为你的
MyClass定义的是自动属性;如果是字段,将GetProperties替换为GetFields即可。 - 加入了大小写忽略匹配逻辑,避免传入字段名大小写不一致导致的匹配失败问题。
- 返回的
List<Dictionary<string, object>>可以直接序列化为JSON等格式,方便后续使用;如果需要强类型返回,可结合动态类型创建,但复杂度较高,一般字典方案足够满足需求。
内容的提问来源于stack exchange,提问作者LonelySemiColon
相关产品推荐
相关产品推荐

