You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法修改密封类DllClass时,如何重写其属性赋值逻辑?

如何拦截密封类DllClass的属性赋值操作

碰到这种密封类没法改源码、又不能继承的情况确实头疼,不过咱们有两种靠谱的方案能实现你要的需求——在Web.config有特定参数时重写DllClassProperty的赋值结果,我给你详细拆解:

方案1:用Harmony做运行时IL拦截(全局生效,最省心)

Harmony是个专门用来修改.NET程序集IL代码的工具,能在运行时偷偷拦截方法(包括属性的setter),完全不需要碰原有代码。

具体步骤:

  1. 先装NuGet包:Install-Package Lib.Harmony
  2. 写拦截逻辑,根据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");
    }
}
  1. 在应用启动的时候(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:30:20