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

在C#反射或单独的派生类中调用受保护的方法?,c#,inheritance,reflection,extension-methods,encapsulation,C#,Inheritance,Reflection,Extension Methods,Encapsulation,我最近发现自己需要从类外部调用受保护的方法(原因很简单:当对象的值发生更改时,我需要阻止对象触发OnValueChanged事件,这只能通过其受保护的集(value,sendCallback)函数实现) 最后,我提出了两个解决方案: 1.)创建派生类,仅添加此函数: public void SetValue (float val, bool callback) { Set(val, callback); } 幸运的是,该类被设置为可继承的,因此它可以工作 2.)使用反射和扩展方法并执行以下操作

我最近发现自己需要从类外部调用受保护的方法(原因很简单:当对象的值发生更改时,我需要阻止对象触发OnValueChanged事件,这只能通过其受保护的集(value,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 });
    }

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

我认为您应该使用派生类,因为受保护的方法正是用于此目的,任何更改都将被编译器捕获


使用反射来做一些原始作者不想做的事情,似乎会让您面临其他意外后果。

我认为您应该使用派生类,因为受保护的方法就是要使用派生类,任何更改都会被编译器捕获

使用反射来做原作者不想做的事情似乎会让您面临其他意外后果。

2)函数重命名在运行时中断,而1)将在编译时中断。您可以使用
nameof()
操作符来防止重命名破坏代码,您应该将
GetMethod()
的结果缓存在静态变量中,以加快执行速度。2)函数重命名在运行时中断,而1)将在编译时中断。您可以使用
nameof()
操作符防止重命名中断代码,并且应该缓存
GetMethod()的结果
在静态变量中,以加快执行速度。