当前位置: 首页 > news >正文

【.net core】支持通过属性名称索引的泛型包装类

/// <summary>
/// 支持通过属性名称索引的泛型包装类
/// </summary>
public class PropertyIndexer<T> : IEnumerable<T>
{private T[] _items;private T _instance;private PropertyInfo[] _properties;private bool _caseSensitive;public PropertyIndexer(T item, bool caseSensitive = true){_instance = item;_caseSensitive = caseSensitive;_properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);}// 通过属性名称获取值public object this[string propertyName]{get{PropertyInfo property = FindProperty(propertyName);if (property == null)throw new ArgumentException($"找不到属性: {propertyName}");return property.GetValue(_instance);}set{PropertyInfo property = FindProperty(propertyName);if (property == null)throw new ArgumentException($"找不到属性: {propertyName}");// 类型转换object convertedValue = Convert.ChangeType(value, property.PropertyType);property.SetValue(_instance, convertedValue);}}// 查找属性(支持大小写敏感/不敏感)private PropertyInfo FindProperty(string propertyName){if (_caseSensitive){return Array.Find(_properties, p => p.Name == propertyName);}else{return Array.Find(_properties, p => p.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase));}}// 获取底层实例public T Instance => _instance;// 实现IEnumerable<T>接口public IEnumerator<T> GetEnumerator(){foreach (T item in _items){yield return item;}}// 显式实现非泛型接口IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}
}

实体类转换方法

//将实体类集合转换为支持属性名称索引的类
public static List<PropertyIndexer<T>> ConvertToPropertyIndexer<T>(List<T> dataList) {List<PropertyIndexer<T>> result = new List<PropertyIndexer<T>>();foreach (T item in dataList) {result.Add(new PropertyIndexer<T>(item));}return result;
}
//索引类转换为实体类
public static List<T> ConvertToPropertyIndexer<T>(List<PropertyIndexer<T>> dataList)
{List<T> result = new List<T>();foreach (PropertyIndexer<T> item in dataList){result.Add(item.Instance);}return result;
}

调用

public ClassA{public string name {get;set;}public string value {get;set;}
}List<ClassA> list = new List<ClassA>(){new ClassA(){name = "a",value="1"  },new ClassA(){name = "b",value="2"  },
}List<PropertyIndexer<ClassA>> values =DataCountCenterService.ConvertToPropertyIndexer<ClassA>(list);Console.WriteLine(values[0]["name"].ToString());//索引取字段值的返回结果是object,需要进行转换,此处输出结果为a

http://www.lryc.cn/news/591997.html

相关文章:

  • 五国联动!德法意西荷 ASIN 同步上架成泛欧计划硬性门槛
  • 构建智能客服Agent:从需求分析到生产部署
  • 持续同调文章阅读(四)
  • 推荐 1 款 4.5k stars 的AI 大模型驱动的开源知识库搭建系统
  • A33-vstar笔记及资料分享:搭建交叉编译环境
  • Linux云计算基础篇(9)-文本处理工具和变量
  • 无符号乘法运算的硬件逻辑实现 ————取自《湖科大教书匠》
  • 【PTA数据结构 | C语言版】多叉堆的上下调整
  • Python MP3 归一化器和长度分割器实用工具开发指南
  • SQL映射文件
  • Android 应用保活思路
  • 树(Tree)
  • 【C++基础】--多态
  • web域名解析
  • 信息论至AI实践:交叉熵的原理全景与应用深度解析
  • Github库镜像到本地私有Gitlab服务器
  • 您的企业需要服务台经理吗?-ManageEngine卓豪
  • 《5分钟开发订单微服务!飞算JavaAI实战:IDEA插件安装→空指针修复→K8s部署全流程》
  • 3C电子产品蓝光三维扫描检测方案-中科米堆CASAIM
  • 机器视觉的布料丝印应用
  • Duckdb处理excel文件
  • 【实战】一次出口连接数超限事故引发的架构反思:强制代理、NAT 网关与大厂最佳实践
  • Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
  • LangChain 源码剖析(七)RunnableBindingBase 深度剖析:给 Runnable“穿衣服“ 的装饰器架构
  • Yoga Air 32,Yoga Air 32,Yoga AIO 9 32IRH8(F0HH,F0HJ)一体机电脑原厂Win11系统镜像
  • 服务攻防-Java组件安全FastJson高版本JNDI不出网C3P0编码绕WAF写入文件CI链
  • AI产品经理面试宝典第36天:AI+旅游以及行业痛点相关面试题的指导
  • sql注入以及Python二分查找
  • 创建型模式
  • MinIO 分布式文件系统