在 C# 中调用受保护的方法 - 反射还是单独的派生类?

kub*_*i98 1 c# reflection inheritance extension-methods encapsulation

我最近发现自己需要从类外部调用受保护的方法(原因很简单:我需要阻止对象在其值更改时触发 OnValueChanged 事件,这只能通过其受保护的 Set(value, sendCallback ) 功能)。

最后我想出了两个解决方案:

1.) 创建一个派生类,并且只添加这个函数:

public void SetValue (float val, bool callback) { Set(val, callback); }
Run Code Online (Sandbox Code Playgroud)

幸运的是,这个类被设置为可继承的,所以它起作用了。

2.) 使用反射和扩展方法并执行以下操作:

public static void SetValue(this Slider slider, float val, bool callback)
    {
        MethodInfo sliderSetMethod = slider.GetType().GetMethod("Set", BindingFlags.NonPublic | BindingFlags.Instance);
        sliderSetMethod.Invoke(slider, new object[] { val, callback });
    }
Run Code Online (Sandbox Code Playgroud)

这也很好用。有什么理由我应该使用一种或另一种吗?它们现在都运行良好,但它们显然不是真正干净的解决方案,所以我想知道它们中的任何一个将来是否会导致问题。

Rob*_*ett 5

我会说您应该使用派生类,因为这就是受保护方法的用途,并且编译器会捕获任何更改。

使用反射来做原作者不打算做的事情似乎会让你对其他意想不到的后果持开放态度。