如何不修改现有类C1代码 替换其静态只读字段的传入委托参数
实现方案
你可以通过反射修改C1私有静态只读字段的方式完成替换,无需修改原C1代码,也不需要重写逻辑,具体实现如下:
方案1:反射替换(无额外依赖,推荐)
实现要点
- 必须在首次访问C1类的任何成员前执行替换逻辑,否则静态字段初始化后再修改不会生效
- 反射可以绕过
readonly关键字的限制,直接修改静态字段的赋值
示例代码
using System.Reflection; using System.Security.Cryptography; // 你的自定义哈希算法创建方法 static SHA256 CreateHashAlgorithm() { // 替换为你自己的实现逻辑 return SHA256.Create(); } // 执行替换逻辑,必须在所有调用C1的代码之前运行 void ReplaceC1Pool() { // 获取C1的类型 Type c1Type = typeof(C1); // 获取私有静态Pool字段的元数据 FieldInfo poolField = c1Type.GetField("Pool", BindingFlags.NonPublic | BindingFlags.Static); if (poolField == null) { throw new InvalidOperationException("未找到C1类的Pool字段,可能第三方包版本已变更"); } // 构造你自定义的ObjectPool实例,参数和原实现保持一致,仅替换工厂委托 var customPool = new ObjectPool<SHA256>(() => CreateHashAlgorithm(), 20); // 给静态字段赋值 poolField.SetValue(null, customPool); }
方案2:运行时Hook(仅适用于反射无法满足的场景)
如果第三方包后续修改了字段名、字段类型导致反射失效,可以引入Harmony等运行时Hook库,直接HookCryptoUtil.Algorithms.CreateHashAlgorithm方法,当传入参数为SecurityAlgorithms.Sha256Digest时直接返回你自定义的SHA256实例即可,该方案无需依赖C1的内部实现细节,但需要额外引入Hook库依赖。
注意事项
- 反射依赖C1的内部实现,第三方包版本升级时需要验证字段名、构造函数参数是否发生变化
- 替换完成后所有C1的逻辑都会复用你传入的自定义委托,原有其他逻辑完全不需要修改
内容的提问来源于stack exchange,提问作者xyzabc
相关产品推荐
相关产品推荐

