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

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.lryc.cn/news/2402491.html

相关文章:

  • Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】
  • Oracle 的 SEC_CASE_SENSITIVE_LOGON 参数
  • Docker构建自定义的镜像
  • 【SSM】SpringMVC学习笔记8:拦截器
  • 井川里予瓜pdf完整版
  • UI自动化常见的一些问题解决方式
  • 基于 Zynq 平台的 EtherCAT 主站的软硬件协同设计
  • 聊一聊 .NET在Linux下的IO多路复用select和epoll
  • 从零开始的嵌入式学习day33
  • ArcGIS Pro 3.4 二次开发 - 宗地
  • 前端面试准备-7
  • 黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)
  • 全球IP归属地查询接口如何用C#进行调用?
  • NumPy 比较、掩码与布尔逻辑
  • 力扣HOT100之二分查找:35. 搜索插入位置
  • 使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息
  • IM即时通讯软件,构建企业局域网内安全协作
  • VueScan:全能扫描,高清输出
  • PyCharm项目和文件运行时使用conda环境的教程
  • 第八部分:第五节 - 生命周期与副作用 (`useEffect` Hook):组件的幕后工作
  • docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(2)
  • DeepSwiftSeek 开源软件 |用于 DeepSeek LLM 模型的 Swift 客户端 |轻量级和高效的 DeepSeek 核心功能通信
  • Flask-Login使用示例
  • React Hooks 基础指南
  • web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作
  • 沪铜6月想法
  • 网络通信核心概念全解析:从IP地址到TCP/UDP实战
  • Spring 中的disposableBean介绍
  • 【Linux命令学习】获取cpu信息 - lscpu命令学习
  • wordpress免费主题网站