在 C# 中调用受保护的方法 - 反射或单独派生 class?
Invoking protected method in C# - reflection or separate derived class?
我最近发现自己需要从 class 外部调用受保护的方法(原因很简单:我需要阻止对象在其值更改时触发 OnValueChanged 事件,这只是可以通过其受保护的 Set(value, sendCallback) 函数实现)。
最后我想到了两个解决方案:
1.) 创建派生class,只添加这个函数:
public void SetValue (float val, bool callback) { Set(val, callback); }
幸运的是,class 被设置为可继承的,所以它起作用了。
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 });
}
这也很好用。有什么理由我应该使用一个或另一个吗?他们现在都工作得很好,但他们显然不是真正干净的解决方案,所以我想知道他们中的任何一个是否会在未来引起问题。
我会说你应该使用派生的 class,因为这是受保护方法的用途,任何更改都会被编译器捕获。
使用反射来做原作者不打算做的事情似乎会让您面临其他意想不到的后果。
我最近发现自己需要从 class 外部调用受保护的方法(原因很简单:我需要阻止对象在其值更改时触发 OnValueChanged 事件,这只是可以通过其受保护的 Set(value, sendCallback) 函数实现)。
最后我想到了两个解决方案:
1.) 创建派生class,只添加这个函数:
public void SetValue (float val, bool callback) { Set(val, callback); }
幸运的是,class 被设置为可继承的,所以它起作用了。
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 });
}
这也很好用。有什么理由我应该使用一个或另一个吗?他们现在都工作得很好,但他们显然不是真正干净的解决方案,所以我想知道他们中的任何一个是否会在未来引起问题。
我会说你应该使用派生的 class,因为这是受保护方法的用途,任何更改都会被编译器捕获。
使用反射来做原作者不打算做的事情似乎会让您面临其他意想不到的后果。