处理ac#构造函数中的可选委托的最佳方法是什么?

林登龙津

我正在重构一个通过构造函数接受可选委托的函数。当在类中触发事件时,将运行委托。如果未传递委托,则使用本地默认函数代替:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ac#构造函数中的“ this”是什么意思?

来自分类Dev

ac#构造函数中的“ this”是什么意思?

来自分类Dev

可选委托方法上的responsToSelector

来自分类Dev

在JavaScript中构造构造函数的最佳实践是什么?

来自分类Dev

编写条件可选构造函数的最佳方法

来自分类Dev

角度:对于指数e,处理(KeyDown)事件中的脏函数检查的最佳方法是什么?

来自分类Dev

构造函数中引发的异常的处理程序是什么?

来自分类Dev

在C ++ DLL中以可从DLL的任何导出函数中访问的方式构造类对象的最佳方法是什么?

来自分类Dev

在Rails表单对象中处理日期的最佳方法是什么

来自分类Dev

处理红宝石中嵌套条件的最佳方法是什么?

来自分类Dev

在Combine中处理错误的最佳方法是什么?

来自分类Dev

处理在R中连接的多个表的最佳方法是什么?

来自分类Dev

在Flutter中处理屏幕尺寸的最佳方法是什么?

来自分类Dev

在Spring Boot中处理异常的最佳方法是什么?

来自分类Dev

在Rails表单对象中处理日期的最佳方法是什么

来自分类Dev

在NodeJS中处理数据的最佳方法是什么?

来自分类Dev

处理红宝石中嵌套条件的最佳方法是什么?

来自分类Dev

在NodeJS中处理大块文本的最佳方法是什么?

来自分类Dev

在 ef core 2 中处理连接的最佳方法是什么

来自分类Dev

从C ++中的函数返回向量的最佳方法是什么

来自分类Dev

在php中接受函数输入参数的最佳方法是什么?

来自分类Dev

在php中读取函数参数的最佳方法是什么?

来自分类Dev

在R中对函数进行算术运算的最佳方法是什么?

来自分类Dev

在Rails中调用Postgres存储函数的最佳方法是什么?

来自分类Dev

在C中实现函数重载的最佳方法是什么?

来自分类Dev

从C ++中的函数返回向量的最佳方法是什么

来自分类Dev

在php中读取函数参数的最佳方法是什么?

来自分类Dev

在函数中填充结构图的最佳方法是什么

来自分类Dev

在C ++中调用构造函数的正确方法是什么?

Related 相关文章

  1. 1

    ac#构造函数中的“ this”是什么意思?

  2. 2

    ac#构造函数中的“ this”是什么意思?

  3. 3

    可选委托方法上的responsToSelector

  4. 4

    在JavaScript中构造构造函数的最佳实践是什么?

  5. 5

    编写条件可选构造函数的最佳方法

  6. 6

    角度:对于指数e,处理(KeyDown)事件中的脏函数检查的最佳方法是什么?

  7. 7

    构造函数中引发的异常的处理程序是什么?

  8. 8

    在C ++ DLL中以可从DLL的任何导出函数中访问的方式构造类对象的最佳方法是什么?

  9. 9

    在Rails表单对象中处理日期的最佳方法是什么

  10. 10

    处理红宝石中嵌套条件的最佳方法是什么?

  11. 11

    在Combine中处理错误的最佳方法是什么?

  12. 12

    处理在R中连接的多个表的最佳方法是什么?

  13. 13

    在Flutter中处理屏幕尺寸的最佳方法是什么?

  14. 14

    在Spring Boot中处理异常的最佳方法是什么?

  15. 15

    在Rails表单对象中处理日期的最佳方法是什么

  16. 16

    在NodeJS中处理数据的最佳方法是什么?

  17. 17

    处理红宝石中嵌套条件的最佳方法是什么?

  18. 18

    在NodeJS中处理大块文本的最佳方法是什么?

  19. 19

    在 ef core 2 中处理连接的最佳方法是什么

  20. 20

    从C ++中的函数返回向量的最佳方法是什么

  21. 21

    在php中接受函数输入参数的最佳方法是什么?

  22. 22

    在php中读取函数参数的最佳方法是什么?

  23. 23

    在R中对函数进行算术运算的最佳方法是什么?

  24. 24

    在Rails中调用Postgres存储函数的最佳方法是什么?

  25. 25

    在C中实现函数重载的最佳方法是什么?

  26. 26

    从C ++中的函数返回向量的最佳方法是什么

  27. 27

    在php中读取函数参数的最佳方法是什么?

  28. 28

    在函数中填充结构图的最佳方法是什么

  29. 29

    在C ++中调用构造函数的正确方法是什么?

热门标签

归档