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

C#中如何将List类型对象的列名与字符串比较并访问列文本?

解决从存储过程结果集中遍历列名并比较的问题

嘿,我明白你的需求了——你现在拿到了存储过程返回的强类型List,但想检查每个对象的属性名称(对应数据库列名)是否匹配特定字符串,同时还要获取该属性的值对吧?因为当前的强类型对象直接访问的是属性值(比如item.C1),没法直接拿到属性名称来做比较,这时候我们可以用C#的反射来实现这个需求。

基础实现:基于属性名的比较

如果你的STORED_PROC_DTL_Result类的属性名和数据库列名是一一对应的(比如数据库列C1对应属性C1),直接用反射遍历属性即可:

modelSP.objAbsentDetail = dbOracle.STORED_PROC_DTL(ENGG, YY, MM, Location).ToList();

// 目标字符串,比如你要匹配的列名/属性名
string targetColumnName = "abc";

foreach(var item in modelSP.objAbsentDetail)
{
    // 获取当前item的所有属性信息
    var properties = item.GetType().GetProperties();
    
    foreach(var prop in properties)
    {
        // 比较属性名和目标字符串,可根据需求选择是否忽略大小写
        if(prop.Name.Equals(targetColumnName, StringComparison.OrdinalIgnoreCase))
        {
            // 获取该属性的文本值,处理可能的null情况
            string propValue = prop.GetValue(item)?.ToString() ?? string.Empty;
            
            // 这里可以添加你的业务逻辑,比如打印值、判断值内容等
            Console.WriteLine($"找到匹配属性:{prop.Name},对应值:{propValue}");
        }
    }
}

代码解释:

  • item.GetType().GetProperties():获取当前对象的所有公共属性元数据,包含属性名、类型、取值方法等信息。
  • prop.Name:对应你要找的“列名”(实体类属性名),直接和目标字符串比较即可。
  • prop.GetValue(item):获取该属性在当前item上的实际值,用?.ToString() ?? string.Empty避免空引用异常,确保返回有效文本。

进阶场景:匹配数据库真实列名(属性名与列名不一致时)

有时候实体类的属性名和数据库列名可能不统一(比如数据库列是COL_ABC,实体属性是ColAbc),这时候实体类通常会用[Column]特性标记真实列名。我们可以读取特性来获取数据库列名:

假设你的STORED_PROC_DTL_Result类定义如下:

public class STORED_PROC_DTL_Result
{
    [Column("COL_ABC")]
    public string C1 { get; set; }
    
    // 其他属性...
}

调整后的代码:

foreach(var item in modelSP.objAbsentDetail)
{
    var properties = item.GetType().GetProperties();
    
    foreach(var prop in properties)
    {
        // 获取Column特性,拿到数据库真实列名;如果没有特性, fallback到属性名
        var columnAttr = prop.GetCustomAttribute<ColumnAttribute>();
        string columnName = columnAttr?.Name ?? prop.Name;
        
        if(columnName.Equals(targetColumnName, StringComparison.OrdinalIgnoreCase))
        {
            string propValue = prop.GetValue(item)?.ToString() ?? string.Empty;
            Console.WriteLine($"找到匹配列:{columnName},对应属性:{prop.Name},值为:{propValue}");
        }
    }
}

注意事项

  • 反射会有轻微性能开销,如果处理的数据集非常大,建议在循环外提前缓存属性信息(比如var props = typeof(STORED_PROC_DTL_Result).GetProperties();),避免重复获取。
  • 如果需要匹配的列名是固定的,直接访问对应属性(比如item.C1)会比反射更高效,反射更适合动态遍历所有列的场景。

内容的提问来源于stack exchange,提问作者Sameep Baxi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:42:38