C#中如何借助委托|反射|表达式来传递类对象属性的“引用”

【C#】引用类型深度拷贝:从浅拷贝陷阱到对象图完全复制 本文探讨了C#中引用类型的深度拷贝实现策略与挑战。文章首先分析了值类型与引用类型赋值的本质区别,指出浅拷贝在处理引用类型时的局限性。接着详细介绍了三种深度拷贝方法:手动逐字段复制、序列化反序列化以及反射自动克隆,并比较了它们的优缺点。针对特殊场景如不可变对象、集合字典、事件委托等,提出了相应的处理策略。文章还提供了基于JSON序列化和反射的具体代码实现示例,并讨论了性能优化方向。最后强调深度拷贝需要在正确性、性能和可维护性之间取得平衡,建议在现代C#设计中优先考虑值语义和不可变性来规避深拷贝的复杂性。 阅读详情
using System.Linq.Expressions;
using System.Reflection;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Demon demon = new() { MyField = 1, MyProperty = 2, };

            //修改字段
            void Modify<T>(ref T field, T newValue)
            {
                field = newValue;
            }
            //通过 传入Action 闭包修改属性
            void ModifyProperty<T>(Action<T> action, T newValue)
            {
                action.Invoke(newValue);
            }

            //通过 反射修改属性
            void ModifyPropertyByRelection<TClass, TProperty>(MethodInfo methodInfo, TClass target,TProperty newValue)
            {
                methodInfo.Invoke(target, new object?[] { newValue });
            }

            //通过 表达式树修改属性
            void ModifyPropertyWithExpression<TProperty, TClass>(Expression<Func<Demon, TProperty>> expression, TClass target, TProperty newValue)
            {
                var body = (MemberExpression)expression.Body;
                var prop = body.Member as PropertyInfo;
                var setMethod = prop!.GetSetMethod();
                setMethod?.Invoke(target, new object?[] { newValue });
            }

            ModifyPropertyWithExpression(d => d.MyProperty, demon, 42);
            Console.WriteLine(demon.MyProperty);


            var method = typeof(Demon).GetProperty(nameof(demon.MyProperty))!.GetSetMethod()!;

            ModifyPropertyByRelection(method, demon,88);

            Console.WriteLine(demon.MyProperty);

            Modify(ref demon.MyField, 55);
            Console.WriteLine(demon.MyField);

            ModifyProperty(x=> demon.MyProperty = x, 66);
            Console.WriteLine(demon.MyProperty);
            
        }



        class Demon
        {
            public int MyProperty { get; set; }
            public int MyField;
        }
    }
}

在这里插入图片描述

Unity热更新方案2024终极指南:四大主流方案深度对比与选型实战 热更新技术是现代游戏开发中保障产品快速迭代与稳定运营的核心机制,其原理在于允许应用在无需重新下载安装包的情况下,动态更新代码与资源。这项技术通过分离应用的核心框架与可变业务逻辑,实现了快速修复线上问题、发布新内容和进行A/B测试的巨大价值,广泛应用于移动游戏、大型应用等需要高频更新的场景。在Unity引擎生态中,**HybridCLR**凭借其扩充IL2CPP运行时以实现原生C#热更的革命性原理,提供了近乎原生的性能与完整的C#特性支持,成为当前中重度项目的热门选择;而**XLua**作为基于Lua虚拟机的 阅读详情

相关推荐

C#与.NET编程全栈技术专题讲座电子书

开发者可通过继承Activity类创建自定义活动:set;set;// 发送邮件逻辑并通过XAML或代码组合成完整流程。持久化机制允许工作流在长时间等待时保存状态至数据库(如SQL Server),恢复时继续执行,保障系统可靠性。graph TDA[开始] --> B{是否付款?B -- 是 --> C[发货]B -- 否 --> D[发送提醒]C --> E[完成]D --> F[等待回调]F --> B。

weixin_29155599的博客 726

Unity开发中C#委托内存泄漏的成因、排查与最佳实践

在C#编程中,委托(Delegate)作为实现事件驱动和回调机制的核心技术,其本质是一个封装了方法引用的类型。它通过维护一个调用列表,允许将多个方法动态关联与执行,是实现观察者模式和解耦组件通信的关键。然而,在拥有独特生命周期管理的Unity引擎中,委托的引用机制与GameObject的销毁逻辑若未妥善协调,极易引发隐蔽的内存泄漏问题,导致托管堆内存持续增长,影响应用性能与稳定性。理解委托在Unity中的内存陷阱,掌握其与对象生命周期、匿名方法捕获等特性的交互原理,是进行性能优化和构建健壮游戏项目的必备技能

weixin_30709061的博客 444

Innovus每日精要 | 用setScanReorderMode优化扫描链,效率翻倍!

在数字后端物理设计的世界里,扫描链优化就像修路一样,既要保证数据流的顺畅,又要尽量减少绕路和资源浪费。它的主要任务是优化扫描链的连接方式,确保数据能快速、安全地流动。无论是多电压域设计、分区设计,还是复杂的逻辑门,它都能帮你搞定。后,你会发现它不仅能帮你节省时间,还能让你的设计更优雅、更高效。下次遇到扫描链问题时,不妨试试这些技巧,说不定你的设计效率会翻倍!,它能帮你搞定扫描链优化的那些事儿,让你的设计更高效、更优雅。接下来,我们看看这个命令的几个关键选项,以及它们的实际用途。扫描链优化看似枯燥,但掌握。

weixin_50820814的博客 1442

C# 使用反射调用方法(MethodInfo.Invoke方法)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace B002_使用反射调用方法_MethodInfo.Invoke方法_ { class...

21号先锋者 1万+

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 612

【导航】ESP32 教学篇目录 【快速跳转】

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 的WIFI及连接的程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨! ↓↓↓通过下方 按钮 进入专栏主页↓↓↓ 专栏主页:点击进入→ESP32 教学专栏 (基于ESP-IDF) WIFI二级专栏:点击进入→ESP32 上的 WiFi ............

Augtons 的博客 3万+

C#中的Invoke

与第一种方式相比,这种方式更加简洁,但使用委托调用方法需要确保委托的签名与要调用的方法的签名匹配。第一个参数是要调用方法的对象实例,如果方法是静态的,则可以传递。是一个用于调用方法的方法,它能够在运行时动态地调用一个方法。第二个参数是方法的参数数组,如上面我们调用Sell方法。等异常,所以在实际使用中应该进行异常处理。在上面的示例中,我们首先创建了一个。方法都可以用于调用方法并传递参数。在上面的示例中,我们首先通过。委托对象,并将其初始化为。方法的调用可能会引发。

标准都是留给不爱的人,爱的本质是自由意志的沉沦 4983

从零开始:用ADS 2023手把手教你设计2.4GHz Wi-Fi LNA(基于ATF-54143,附模型文件)

本文详细介绍了如何使用ADS 2023软件设计2.4GHz Wi-Fi频段的低噪声放大器(LNA),基于ATF-54143晶体管。内容涵盖模型导入、直流工作点确定、稳定性优化、噪声匹配等关键步骤,并提供可下载的模型文件包,帮助工程师快速掌握LNA设计技巧。

weixin_42531128的博客 320

C# MethodInfo.Invoke捕获被调用函数的异常

通过MethodInfo.Invoke调用函数时,无法直接捕获被调用函数抛出的异常的解决办法。

Python的专栏 2848

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

PostgreSQL:Patroni 高可用架构,基于etcd的自动故障转移集群

本文详细介绍了基于Patroni和etcd构建PostgreSQL高可用集群的方案。Patroni作为外部守护进程,通过etcd分布式协调服务实现自动故障转移、主节点选举等关键功能,弥补了PostgreSQL原生缺乏自动故障转移的不足。文章涵盖核心架构(3节点PG+3节点etcd)、环境规划、etcd集群部署(包括配置验证)以及Patroni安装配置的关键步骤,特别强调了Patroni自动初始化PG实例、配置同步复制等生产级特性。该方案通过外部组件协同工作,在不修改PG源码的情况下实现了生产环境所需的高可用

数据知道的博客 2491

Unity3D学习2——C#学习

1、C# csharp Microsoft为.NET推出的高级编程语言。.NET是微软的多语言开发平台,用于构建和运行应用程序。 Mono是Novell公司支持在其他操作系统之下开发.NET程序的框架,而不是只适用于Windows。Unity借助Mono实现跨平台,核心是.NET Framework框架。 这样子Unity借助Mono实现跨平台开发。 所以Unity的核心是C#和Mono。 .Net框架的组件: 公共语言运行库(CLR) .Net框架类库 公共语言规范(CLS) 通用类型系统 元数据和组件

二毛的博客 4030

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

《深入理解 C# (第2版)》 - 学习笔记

《深入理解 C#》 (第2版) ========== ========== ========== [作者] (英) Jon Skeet [译者] (中) 周靖 朱永光 姚琪琳 [出版] 人民邮电出版社 [版次] 2012年01月 第1版 [印次] 2012年01月 第1次 印刷 [定价] 79.00元 ========== ========== ========== 【关于本书】 具体地说,...

GATTACA2011 336

移动支付APP(仿支付宝)

Toast.makeText(PayActivity.this, "支付失败:" + payResponse.getMsg(), Toast.LENGTH_SHORT).show();Toast.makeText(PayActivity.this, "支付失败:" + t.getMessage(), Toast.LENGTH_SHORT).show();Toast.makeText(PayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

寒寒豆豆软件公司的博客 135

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

解析字符串代码为委托:LambdaParser的更新

前篇:LambdaParser:解析字符串代码为Lambda表达式并编译为委托 最近更新1.支持生成非强类型的委托。2.可传入默认实例。在代码中可直接访问默认实例的成员,不需要变量名。 匿名类型的属性访问若匿名类型仅在局部使用,是可以直接访问其属性的。但若想让其跨函数呢(比如将获取数据的部分封装成一个方法,返回匿名类型)? 不想因此多维护一个新数据类。于是只能通过object类型传递(参...

weixin_30333885的博客 218

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

unity常见面试题

接口是一种完全抽象的类型,它只定义了成员的签名,但没有提供成员的实现。接口定义了对象应该具有的方法、属性和事件。抽象类是一种包含了抽象成员(方法、属性、索引器、事件)的类,它可以包含抽象成员和非抽象成员的实现。抽象类可以包含方法的实现,也可以包含字段和构造函数等。

yasin的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python与C#相比特有的一些语法总结

Python 的语法设计注重简洁和灵活性,适合快速开发和原型设计。C# 则更注重类型安全和性能,适合构建大型应用程序。两者的语法差异反映了它们的不同设计理念和应用场景。

yuanpan的专栏 1109

手把手教你搭建C#热更新系统:ILRuntime 3.0集成避坑指南与最佳实践

解决C#热更新难题,本文详解C#在游戏开发中的热更新方案(ILRuntime 3.0),涵盖集成步骤、常见坑点与性能优化策略,适用于Unity项目热修复与资源逻辑动态加载,实现高效安全的热更新机制,值得收藏。

VarFun的博客 842

【AOT兼容性实战宝典】:掌握这6种场景适配策略,告别部署失败

掌握AOT的兼容性难题,6大场景适配策略全解析。涵盖动态加载、第三方库集成等典型问题,提供编译优化与降级方案,提升部署成功率。实战经验丰富,适配主流框架,告别构建失败,值得收藏。

VarPerch的博客 667

C#.NET:高级编程之匿名类、匿名方法与扩展方法

转载,来源http://www.cnblogs.com/edisonchou/p/4088959.html  [文中插图丢失,推荐查看原文]!important .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法 开篇:在上一篇中,我们了解了自动属性、隐式类型、自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类、匿名方法以及常用的扩展方法。虽然,都是很常见的东西,但是

程序员养成计划 2339

C#开发心得

IR(中间语言)等价于java的字节码。CLR(公共语言运行时)等价于JVM,用来执行IR。运行在.NET上的C#/F#/VB.NET/IronPython等语言都可以编译为IR,彼此互操作,就像JVM上kotlin/scala通过字节码与java语言互操作类似。

tlxamulet的博客 558

【转】.NET IL实现对象深拷贝

对于深拷贝,通常的方法是将对象进行序列化,然后再反序化成为另一个对象。例如在stackoverflow上有这样的解决办法:https://stackoverflow.com/questions/78536/deep-cloning-objects/78612#78612。这种序列化的方式,对深拷贝来讲,无疑是一个性能杀手。 今天大家介绍一个深拷贝的框架DeepCopy,github地址:htt...

weixin_30549657的博客 134

Unity性能优化实战:定位与消除GC Alloc与GC Spike的根源

在Unity游戏开发中,内存管理是影响性能的核心环节。托管堆内存的分配与回收机制,直接关系到游戏的流畅度。垃圾回收(GC)在执行时,会暂停所有托管线程进行内存整理,这个过程引发的CPU耗时峰值被称为GC Spike,是导致游戏卡顿的常见元凶。其根源往往在于代码中产生了高频、不必要的托管堆内存分配(GC Alloc)。从技术价值看,理解并控制GC Alloc是提升应用响应速度和帧率稳定性的关键工程实践。常见的应用场景包括UI系统更新、粒子特效播放、资源异步加载以及高频逻辑循环。本文聚焦于两个隐蔽的GC All

weixin_34067102的博客 453
上一篇: PLC ST语言经典电路之 一键启停 和 时钟脉冲
下一篇: 使用Halcon实现模板匹配
潘诺西亚的火山
博客等级 码龄10年 7415粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值