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. 数据展示与报表生成
在生成报表或数据展示时,可以使用GetDescriptions
和GetDisplayNames
方法获取属性的友好名称,提高可读性。
2. 动态数据处理
ToDictionary
方法使对象可以方便地转换为动态数据结构,适用于与动态语言交互或处理未知类型的对象。
3. 对象复制与数据传输
Clone
方法提供了一种简单的对象深拷贝方式,适用于需要创建对象副本而不影响原始对象的场景,如数据传输或缓存。
4. 自动化测试
在编写单元测试时,可以使用这些方法快速获取对象的属性信息,简化测试代码。
通过这些扩展方法,我们可以更灵活高效地操作对象,减少样板代码,提高代码的可读性和可维护性。
如果你需要对博客内容进行调整,比如增加更多使用示例、优化代码解释或扩展应用场景,欢迎随时告诉我。
相关文章:
C#对象扩展方法:提升对象操作的灵活性与效率
C#对象扩展方法:提升对象操作的灵活性与效率 在C#编程中,我们经常需要对对象进行各种操作,如获取对象属性信息、转换对象格式、复制对象等。通过扩展方法,我们可以为现有类型添加新的功能,而无需修改原始类型的代码。…...
Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】
Python爬取天猫商品数据详细教程 一、前期准备 1. 环境配置 Python环境:确保已安装Python 3.x版本,建议使用Anaconda或直接从Python官网下载安装。第三方库: requests:用于发送HTTP请求。BeautifulSoup:用于解析HTM…...
Oracle 的 SEC_CASE_SENSITIVE_LOGON 参数
Oracle 的SEC_CASE_SENSITIVE_LOGON 参数 关键版本信息 SEC_CASE_SENSITIVE_LOGON 参数在以下版本中被弃用: Oracle 12c Release 1 (12.1): 该参数首次被标记为"过时"(obsolete)但依然保持功能有效 Oracle 18c/19c 及更高版本: …...

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

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

井川里予瓜pdf完整版
井川里予瓜pdf完整版 下载链接: 链接:https://pan.quark.cn/s/c75455d6be60 在网红文化盛行的当下,井川里予无疑是一位备受瞩目的人物。这位2001年出生于广东湛江的姑娘,凭借独特风格在网络世界掀起波澜,其发展轨迹…...
UI自动化常见的一些问题解决方式
1、遇到元素无法定位的情况 解决方法:(1)手写css 先找到父级的唯一元素 (2)手写xpath、 (3)js在浏览器控制台去定位 控制台定位样例:(1)…...

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

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

从零开始的嵌入式学习day33
网络编程及相关概念 UDP网络通信程序 UDP网络通信操作 一、网络编程及相关概念 1. 网络编程概念: 指通过计算机网络实现程序间通信的技术,涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。…...
ArcGIS Pro 3.4 二次开发 - 宗地
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 宗地1 宗地1.1 向地图添加宗地图层1.2 获取活动记录1.3 设置活动记录1.4 创建新记录1.5 将标准线要素复制到宗地类型1.6 将宗地线复制到宗地类型1.7 将要素分配给活动记录1.8 创建宗地种子1.9 构建地块1.10 重复地块1.11 设置地块为…...
前端面试准备-7
1.定义class的实现 //定义class class Person{//公有属性nameage 18//构造函数constructor(name){//构造函数内部的this实例化对象this.name name//动态添加属性(不推荐)this.food [🐂,🐎,🐏]}//公有方法sayHi(){c…...

黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)
一. 单例bean Spring框架中的单例bean是线程安全的吗? Spring框架中的bean是单例的,可以在注解Scope()进行设置 singleton:bean在每一个Spring IOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例 总结 二. AOP AOP称…...

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

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

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

使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

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

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

PyCharm项目和文件运行时使用conda环境的教程
打开【文件】—【新建项目】 按照下图配置环境 可以看到我这个项目里,报错“No module named modelscope” 点击终端,输入命令 #显示所有的conda环境 conda env list #选择需要激活的conda环境 conda activate XXX在终端中,执行pip install …...
第八部分:第五节 - 生命周期与副作用 (`useEffect` Hook):组件的幕后工作
知识点: 组件生命周期(挂载 Mounting, 更新 Updating, 卸载 Unmounting - 高级概念),副作用 (Side Effects),useEffect Hook (用于处理副作用,如数据获取、订阅、DOM 操作),useEffect 的依赖数组…...
docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(2)
3、创建compose 的yml文件 version: "3.9" services:#配置nginxnginx:#镜像名称 nginx:latestimage: nginx#自定义容器的名称#container_name: c_nginxports:- "80:80"#lnmp目录和容器的/usr/share/nginx/html目录进行绑定,设置rw权限#将宿主机的~/lnmp/…...

DeepSwiftSeek 开源软件 |用于 DeepSeek LLM 模型的 Swift 客户端 |轻量级和高效的 DeepSeek 核心功能通信
一、软件介绍 文末提供程序和源码下载 DeepSeek Swift SDK 是一个轻量级且高效的基于 Swift 的客户端,用于与 DeepSeek API 进行交互。它支持聊天消息完成、流式处理、错误处理以及使用高级参数配置 DeepSeekLLM。 二、Features 特征 Supports chat completion …...

Flask-Login使用示例
项目结构 首先创建以下文件结构: 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…...
React Hooks 基础指南
React Hooks 是 React 16.8 引入的重要特性,它允许开发者在函数组件中使用状态和其他 React 特性。本文将详细介绍 6 个最常用的 React Hooks。 1. useState useState 是最常用的 Hook,用于在函数组件中添加 state。 import React, { useState } from…...

web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作
前言 在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。 在客户端工具中,编写增删改查的SQL语句,发给MySQL数据库管理系统,由数据库管理系统执行SQL语句并返回执…...
沪铜6月想法
市场回顾 2025年5月,沪铜期货主力合约价格整体呈现震荡走势。从月初到月末,价格在7.67-7.82万元/吨之间波动。截至5月31日,沪铜主力合约收盘价为7.76万元/吨。本月铜价围绕供需基本面和宏观政策预期展开波动,尤其在5月14日至5月1…...
网络通信核心概念全解析:从IP地址到TCP/UDP实战
一、网络基础架构三要素 1. IP地址:互联网的“门牌号” 本质:32位整数标识主机位置(IPv4)表示法:点分十进制(如 192.168.1.1)功能:全球唯一标识网络设备特殊地址: 127.…...
Spring 中的disposableBean介绍
在 Spring 框架中,DisposableBean 是一个接口,用于定义 Bean 在被销毁前需要执行的清理逻辑。它是 Spring 容器生命周期回调机制的一部分。 🌱 什么是 DisposableBean DisposableBean 接口是 Spring 提供的一个标准接口,用于通知…...
【Linux命令学习】获取cpu信息 - lscpu命令学习
lscpu命令显示的是服务器cpu架构相关信息,lscpu从伪文件系统(sysfs)、/proc/cpuinfo和任何可用的特定体系架构库中收集cpu架构信息。输出内容包括:CPU、线程、内核的数量以及非同一存储器存取节点。此外还包括关于CPU高速缓存和高速缓存共享的信息&#…...