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

C#对象扩展方法:提升对象操作的灵活性与效率

C#对象扩展方法:提升对象操作的灵活性与效率

在C#编程中,我们经常需要对对象进行各种操作,如获取对象属性信息、转换对象格式、复制对象等。通过扩展方法,我们可以为现有类型添加新的功能,而无需修改原始类型的代码。下面介绍的ObjectExtensions静态类,就通过扩展方法为object类型提供了一系列实用功能。

public static class ObjectExtensions
{public static Dictionary<string, string> GetPropertiesAndDescriptions(this object o){return o.GetType().GetProperties().Select(p => (p.Name, (p.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description)).ToDictionary(p => p.Name, p => p.Description);}public static Dictionary<string, object> GetDescriptionsAndValues(this object o){return o.GetType().GetProperties().ToDictionary(f => (f.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description,f => f.GetValue(o));}public static List<string> GetDescriptions(this object o){return o.GetType().GetProperties().Select(p => (p.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description).ToList();}public static List<string> GetDisplayNames(this object o){return o.GetType().GetProperties().Select(p => (p.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute).DisplayName).ToList();}public static Dictionary<string, object> ToDictionary(this object o){return o.GetType().GetProperties().Select(p => (p.Name, Value: p.GetValue(o))).ToDictionary(p => p.Name, p => p.Value);}public static T Clone<T>(this T o) where T : new(){return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(o));}
}

一、代码解析

这个扩展类提供了六个实用方法,下面逐一解析:

1. GetPropertiesAndDescriptions方法

该方法通过反射获取对象属性的名称和描述信息(使用DescriptionAttribute特性标记),返回一个字典,键为属性名,值为属性描述。这在需要显示属性友好名称的场景中非常有用。

2. GetDescriptionsAndValues方法

此方法返回一个字典,键为属性的描述信息,值为属性的当前值。这在需要以描述信息作为标识来获取属性值的场景中很实用。

3. GetDescriptions方法

该方法返回对象所有属性的描述信息列表,忽略属性名和值,适用于只需要属性描述的场景。

4. GetDisplayNames方法

GetDescriptions类似,但获取的是DisplayNameAttribute特性标记的显示名称,通常用于UI显示。

5. ToDictionary方法

将对象的所有属性名和对应值转换为字典,这在需要将对象动态转换为键值对集合的场景中非常有用,比如序列化或动态数据处理。

6. Clone方法

通过JSON序列化和反序列化实现对象的深拷贝。这种方法适用于大多数对象,但需要注意性能开销和循环引用问题。

二、使用示例

下面是这些扩展方法的使用示例,假设我们有一个Person类:

public class Person
{[Description("姓名")][DisplayName("用户姓名")]public string Name { get; set; }[Description("年龄")][DisplayName("用户年龄")]public int Age { get; set; }[Description("邮箱")][DisplayName("电子邮箱")]public string Email { get; set; }
}

1. 获取属性描述和值

var person = new Person { Name = "张三", Age = 30, Email = "zhangsan@example.com" };// 获取属性名和描述的字典
var propertiesAndDescriptions = person.GetPropertiesAndDescriptions();
// 输出: { "Name": "姓名", "Age": "年龄", "Email": "邮箱" }// 获取描述和值的字典
var descriptionsAndValues = person.GetDescriptionsAndValues();
// 输出: { "姓名": "张三", "年龄": 30, "邮箱": "zhangsan@example.com" }// 获取描述列表
var descriptions = person.GetDescriptions();
// 输出: [ "姓名", "年龄", "邮箱" ]// 获取显示名称列表
var displayNames = person.GetDisplayNames();
// 输出: [ "用户姓名", "用户年龄", "电子邮箱" ]

2. 对象转字典和克隆

// 对象转字典
var dictionary = person.ToDictionary();
// 输出: { "Name": "张三", "Age": 30, "Email": "zhangsan@example.com" }// 对象克隆
var clonedPerson = person.Clone();
// clonedPerson 是 person 的深拷贝

三、应用场景

这些扩展方法在实际开发中有广泛的应用场景:

1. 数据展示与报表生成

在生成报表或数据展示时,可以使用GetDescriptionsGetDisplayNames方法获取属性的友好名称,提高可读性。

2. 动态数据处理

ToDictionary方法使对象可以方便地转换为动态数据结构,适用于与动态语言交互或处理未知类型的对象。

3. 对象复制与数据传输

Clone方法提供了一种简单的对象深拷贝方式,适用于需要创建对象副本而不影响原始对象的场景,如数据传输或缓存。

4. 自动化测试

在编写单元测试时,可以使用这些方法快速获取对象的属性信息,简化测试代码。

通过这些扩展方法,我们可以更灵活高效地操作对象,减少样板代码,提高代码的可读性和可维护性。

如果你需要对博客内容进行调整,比如增加更多使用示例、优化代码解释或扩展应用场景,欢迎随时告诉我。

http://www.lqws.cn/news/99181.html

相关文章:

  • 【Web应用】若依框架:基础篇13 源码阅读-前端代码分析
  • 物联网数据归档方案选择分析
  • 24.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--认证微服务
  • 华为盘古 Ultra MoE 模型:国产 AI 的技术突破与行业影响
  • 更新已打包好的 Spring Boot JAR 文件中的 class 文件
  • Vue.js教学第十八章:Vue 与后端交互(二):Axios 拦截器与高级应用
  • 从汇编的角度揭秘C++引用,豁然开朗
  • 硬件工程师笔记——555定时器应用Multisim电路仿真实验汇总
  • CRM管理软件的数据可视化功能使用技巧:让数据驱动决策
  • SpringBoot 之 JWT
  • 8.RV1126-OPENCV 视频中添加LOGO
  • Web后端快速入门(Maven)
  • OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
  • Vert.x学习笔记-Verticle原理解析
  • Java数据校验:确保数据完整性和正确性
  • Modbus转Ethernet IP赋能挤出吹塑机智能监控
  • ChatGPT实战嵌入式开发应用指南与代码演示
  • 笔记本/台式C盘扩容:删除、压缩、跨分区与重分配—「小白教程」
  • 调用.net DLL让CANoe自动识别串口号
  • [Java恶补day14] 56. 合并区间
  • SQL 筛选出在表1但不在表2中的数据
  • Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
  • 【Redis】set 类型
  • qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
  • MySQL 如何判断某个表中是否存在某个字段
  • 基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例
  • React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术
  • 结构性设计模式之Composite(组合)
  • Spring AI 项目实战(一):Spring AI 核心模块入门
  • MongoDB数据库学习