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

时间:2018-10-19 13:37:48

标签: c# inheritance reflection extension-methods encapsulation

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

最后,我提出了两种解决方案:

1。)创建一个派生类,仅添加此功能:

public void SetValue (float val, bool callback) { Set(val, callback); }

幸运的是,该类被设置为可继承的,因此它可以正常工作。

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 });
    }

这也很好。我为什么要使用一个或另一个?两者现在都可以正常工作,但显然它们并不是真正的解决方案,因此,我想知道它们中的任何一个将来是否会引起问题。

1 个答案:

答案 0 :(得分:4)

我会说您应该使用派生类,因为这就是要使用的受保护方法,并且所有更改都将被编译器捕获。

使用反思来做原始作者不打算做的事情,似乎会让您承受其他意想不到的后果。