我最近发现自己需要从类外部调用受保护的方法(简短原因:我需要在对象的值更改时停止触发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 });
}
这也很好。我为什么要使用一个或另一个?两者现在都可以正常工作,但显然它们并不是真正的解决方案,因此,我想知道它们中的任何一个将来是否会引起问题。
答案 0 :(得分:4)
我会说您应该使用派生类,因为这就是要使用的受保护方法,并且所有更改都将被编译器捕获。
使用反思来做原始作者不打算做的事情,似乎会让您承受其他意想不到的后果。