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
相关产品推荐
相关产品推荐

