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