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

news2025/6/7 5:04:42

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.coloradmin.cn/o/2402491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker构建自定义的镜像

构建自定义的 Docker 镜像是 Docker 使用中的核心操作之一。通过自定义镜像&#xff0c;你可以将应用程序及其依赖环境打包成一个可移植的容器化镜像。以下是详细的步骤和注意事项&#xff1a; 1. 准备工作 在构建自定义镜像之前&#xff0c;你需要准备以下内容&#xff1a; D…

【SSM】SpringMVC学习笔记8:拦截器

这篇学习笔记是Spring系列笔记的第8篇&#xff0c;该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记&#xff0c;供自己和他人参考。 Spring学习笔记目录 笔记1&#xff1a;【SSM】Spring基础&#xff1a; IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…

井川里予瓜pdf完整版

井川里予瓜pdf完整版 下载链接&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/c75455d6be60 在网红文化盛行的当下&#xff0c;井川里予无疑是一位备受瞩目的人物。这位2001年出生于广东湛江的姑娘&#xff0c;凭借独特风格在网络世界掀起波澜&#xff0c;其发展轨迹…

基于 Zynq 平台的 EtherCAT 主站的软硬件协同设计

摘要: 针对工业自动化对控制能力和强实时性的需求&#xff0c;提出了一种基于 FPGA 的改进型 EtherCAT 硬件主站方案 。 该方案利用 Zynq&#xff0d;7000 平台&#xff0c;在 PL 端实现 FPGA 协议栈&#xff0c;以保证核心功能的高效执 行 。 基于 AXI4 总线设计…

聊一聊 .NET在Linux下的IO多路复用select和epoll

一&#xff1a;背景 1. 讲故事 在windows平台上&#xff0c;相信很多人都知道.NET异步机制是借助了Windows自带的 IO完成端口 实现的异步交互&#xff0c;那在 Linux 下.NET 又是怎么玩的呢&#xff1f;主要还是传统的 select&#xff0c;poll&#xff0c;epoll 的IO多路复用…

从零开始的嵌入式学习day33

网络编程及相关概念 UDP网络通信程序 UDP网络通信操作 一、网络编程及相关概念 1. 网络编程概念&#xff1a; 指通过计算机网络实现程序间通信的技术&#xff0c;涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。…

黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)

一. 单例bean Spring框架中的单例bean是线程安全的吗&#xff1f; Spring框架中的bean是单例的&#xff0c;可以在注解Scope()进行设置 singleton&#xff1a;bean在每一个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例 总结 二. AOP AOP称…

全球IP归属地查询接口如何用C#进行调用?

一、什么是全球IP归属地查询接口 在全球化互联网时代&#xff0c;IP地址作为网络世界的地理位置标识&#xff0c;扮演着至关重要的角色。全球IP归属地查询接口通过解析IP地址&#xff0c;提供包括国家、省、市、区县和运营商在内的详细信息。 二、应用场景 1. 访问识别 全球…

NumPy 比较、掩码与布尔逻辑

文章目录 比较、掩码与布尔逻辑示例&#xff1a;统计下雨天数作为通用函数&#xff08;Ufuncs&#xff09;的比较运算符使用布尔数组计数条目布尔运算符 布尔数组作为掩码使用关键字 and/or 与运算符 &/| 的区别 比较、掩码与布尔逻辑 本文介绍如何使用布尔掩码来检查和操…

力扣HOT100之二分查找:35. 搜索插入位置

这道题属于是二分查找的入门题了&#xff0c;我依稀记得一些二分查找的编码要点&#xff0c;但是最后还是写出了一个死循环&#xff0c;无语(ˉ▽ˉ&#xff1b;)…又回去看了下自己当时的博客和卡哥的视频&#xff0c;这才发现自己分情况只分了两种&#xff0c;最后导致死循环…

使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

IM即时通讯软件,构建企业局域网内安全协作

安全与权限&#xff1a;协同办公的企业级保障 在协同办公场景中&#xff0c;BeeWorks 将安全机制贯穿全流程。文件在局域网内传输与存储时均采用加密处理&#xff0c;企业网盘支持水印预览、离线文档权限回收等功能&#xff0c;防止敏感资料外泄&#xff1b;多人在线编辑文档时…

VueScan:全能扫描,高清输出

在数字化办公和图像处理的领域&#xff0c;扫描仪扮演着不可或缺的角色。无论是文档的数字化存档、照片的高清复制&#xff0c;还是创意项目的素材采集&#xff0c;一款性能卓越、操作便捷的扫描软件能大幅提升工作效率和成果质量。VueScan正是这样一款集多功能于一身的扫描仪软…

PyCharm项目和文件运行时使用conda环境的教程

打开【文件】—【新建项目】 按照下图配置环境 可以看到我这个项目里&#xff0c;报错“No module named modelscope” 点击终端&#xff0c;输入命令 #显示所有的conda环境 conda env list #选择需要激活的conda环境 conda activate XXX在终端中&#xff0c;执行pip install …

DeepSwiftSeek 开源软件 |用于 DeepSeek LLM 模型的 Swift 客户端 |轻量级和高效的 DeepSeek 核心功能通信

​一、软件介绍 文末提供程序和源码下载 DeepSeek Swift SDK 是一个轻量级且高效的基于 Swift 的客户端&#xff0c;用于与 DeepSeek API 进行交互。它支持聊天消息完成、流式处理、错误处理以及使用高级参数配置 DeepSeekLLM。 二、Features 特征 Supports chat completion …

Flask-Login使用示例

项目结构 首先创建以下文件结构&#xff1a; flask_login_use/ ├── app.py ├── models.py ├── requirements.txt └── templates/├── base.html├── index.html├── login.html├── register.html└── profile.html1. requirements.txt Flask2.3.3 Fl…

web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作

前言 在前面我们学习MySQL数据库时&#xff0c;都是利用图形化客户端工具(如&#xff1a;idea、datagrip)&#xff0c;来操作数据库的。 在客户端工具中&#xff0c;编写增删改查的SQL语句&#xff0c;发给MySQL数据库管理系统&#xff0c;由数据库管理系统执行SQL语句并返回执…

wordpress免费主题网站

这是一款WordPress主题&#xff0c;由jianzhanpress开发&#xff0c;可以免费下载。专为中小微企业设计&#xff0c;提供专业的网站建设、网站运营维护、网站托管和网站优化等服务。主题设计简约、现代&#xff0c;适合多种行业需求。 主要特点&#xff1a; 多样化展示&#…

Go中的协程并发和并发panic处理

1 协程基础 1.1 协程定义&#xff08;Goroutine&#xff09; 概念&#xff1a;Go 语言特有的轻量级线程&#xff0c;由 Go 运行时&#xff08;runtime&#xff09;管理&#xff0c;相比系统线程&#xff08;Thread&#xff09;&#xff0c;创建和销毁成本极低&#xff0c;占用…

Qt Creator工具编译器配置

1、打开Qt Creator&#xff0c;工具-->选项 2、选择"编译器"&#xff0c;Manual配置编译器。 初始化填入“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe”&#xff0c;选择64位amd64。 ABI根据msvc版本进行选择msvc2015. 3、新建项目…