我正在重构一个通过构造函数接受可选委托的函数。当在类中触发事件时,将运行委托。如果未传递委托,则使用本地默认函数代替:
public class Foo
{
int _memberVariable;
readonly Action _onEventOne;
readonly Action _onEventTwo;
public Foo(Action onEventOne, Action onEventTwo = null)
{
_memberVariable = 0;
_onEventOne = onEventOne;
_onEventTwo = onEventTwo ?? DefaultEventTwo;
_onEventOne();
}
private void DefaultEventTwo()
{
++_memberVariable;
}
}
我正在寻找删除默认值(这是一个公共接口,因此重载是可取的),这是在生产代码中的,因此除非希望,否则我不想更改该接口。
在理想的世界中,我将使用构造函数链接:
public Foo(Action onEventOne) : this(onEventOne, DefaultEventTwo)
{
//CS0120 An object reference is required for the non-static field, method, or property 'Foo.DefaultEventTwo()
}
(我明白为什么这行不通,只是举例说明如果不是构造函数,我将使用哪种解决方案)。
因为委托是只读的,所以我无法在共享的初始化类型函数中设置委托。
是否有比仅传入null然后在主构造函数中捕获它更好的方法来处理类似的情况?感觉不太优雅,我希望能够理想地捕获一个null动作作为异常(例如,如果外部调用者使用null而不是使用重载的构造函数)。我可以从代表中删除只读,但是由于它们实际上是只读的,因此这也不是一个很好的解决方案。
任何想法将不胜感激。
我可以使它工作的唯一方法是使它工作起来很丑(我个人认为)。
您必须提供一个静态方法,但是该静态方法可以使用对此的引用来获取实际方法。
这就是我想出的。
public Foo(Action onEventOne) : this(onEventOne, self => self.DefaultEventTwo)
{
//CS0120 An object reference is required for the non-static field, method, or property 'Foo.DefaultEventTwo()
}
public Foo(Action onEventOne, Action onEventTwo = null) : this(onEventOne, self => onEventTwo)
{ }
// private constructor, just for the sake of getting it working
private Foo(Action onEventOne, Func<Foo, Action> onEventTwo = null)
{
_memberVariable = 0;
_onEventOne = onEventOne;
_onEventTwo = onEventTwo(this); // <--
_onEventOne();
}
self => self.DefaultEventTwo
是获得动作的静态函数。该函数在调用中onEventTwo(this)
用于获取this
实例的默认事件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句