无法修改密封类DllClass时,如何重写其属性赋值逻辑?
如何拦截密封类
DllClass的属性赋值操作 碰到这种密封类没法改源码、又不能继承的情况确实头疼,不过咱们有两种靠谱的方案能实现你要的需求——在Web.config有特定参数时重写DllClassProperty的赋值结果,我给你详细拆解:
方案1:用Harmony做运行时IL拦截(全局生效,最省心)
Harmony是个专门用来修改.NET程序集IL代码的工具,能在运行时偷偷拦截方法(包括属性的setter),完全不需要碰原有代码。
具体步骤:
- 先装NuGet包:
Install-Package Lib.Harmony - 写拦截逻辑,根据Web.config的配置决定要不要改值:
using HarmonyLib; using System.Configuration; using System.Reflection; public class DllClassPropertyPatch { public static void SetupPropertyOverride() { // 先读Web.config里的开关 var shouldOverride = bool.Parse(ConfigurationManager.AppSettings["OverrideDllProperty"] ?? "false"); if (!shouldOverride) return; var harmony = new Harmony("your.unique.patch.id"); // 找到DllClassProperty的setter方法 var setter = typeof(DllClass).GetProperty("DllClassProperty")?.GetSetMethod(); if (setter == null) return; // 给setter打补丁,在它执行完后强制改值 harmony.Patch(setter, postfix: new HarmonyMethod(typeof(DllClassPropertyPatch).GetMethod(nameof(AfterSetterRuns)))); } // 这个方法会在原setter执行后触发 public static void AfterSetterRuns(DllClass __instance) { // 把属性值改成你想要的内容 typeof(DllClass).GetProperty("DllClassProperty")?.SetValue(__instance, "new value"); } }
- 在应用启动的时候(比如Global.asax的
Application_Start里)调用DllClassPropertyPatch.SetupPropertyOverride()就行。
这个方案的好处是全局生效,不管你的上千个DllClass实例是自己创建的还是第三方代码生成的,都会被拦截到,完全不用改原有实例的使用逻辑。
方案2:写包装器替换实例(适合能控制实例创建的场景)
如果你的DllClass实例都是自己代码创建的,那可以写个包装类把原实例包起来,对外暴露一模一样的属性,在赋值的时候判断配置:
using System.Configuration; public class DllClassWrapper { private readonly DllClass _realInstance; private readonly bool _overrideEnabled; public DllClassWrapper(DllClass realInstance) { _realInstance = realInstance; _overrideEnabled = bool.Parse(ConfigurationManager.AppSettings["OverrideDllProperty"] ?? "false"); } public string DllClassProperty { get => _realInstance.DllClassProperty; set { // 根据配置决定用传入的值还是咱们指定的新值 var finalValue = _overrideEnabled ? "new value" : value; _realInstance.DllClassProperty = finalValue; } } // 如果DllClass还有其他方法或属性,记得在这里也做对应的包装哦 }
然后把所有创建DllClass的地方改成创建DllClassWrapper,之后用包装类来操作属性就行。这个方案不用依赖第三方库,实现简单,但如果实例是第三方代码创建的,就没法控制了。
关于你设想的监听类
你想的那种OnSetPropertyListener,C#本身没有原生支持这种“自动监听属性赋值”的机制,但上面两种方案都能达到类似的效果:方案1是全局拦截所有赋值操作,方案2是在可控范围内接管赋值逻辑,都能满足你根据Web.config配置重写值的需求。
内容的提问来源于stack exchange,提问作者Renan Araújo
相关产品推荐
相关产品推荐

