You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射在运行时筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:53:32