c#委托引用数组

本文关键字:数组 引用 | 更新日期: 2023-09-27 17:50:14

当引用其他类时,我们使用委托。在单元测试中,我们重写这些值。

我有一个类,它引用了20多个其他类,所以我想我应该创建一个委托数组。如果我为这些委托创建一个静态数组(见下面的代码),它将存储委托的值,而不是对委托的引用。

结果,单元测试不能更新值。为了解决这个问题,我已经创建了委托数组,当我想使用它们,但我希望下面的代码工作。

private static Func<int, bool> firstMethod = ExternalClass1.Method;
private static Func<int, bool> secondMethod = ExternalClass2.Method;
private static Func<int, bool> thirdMethod = ExternalClass3.Method;
private static Func<int, bool>[] handlers = { first, second, third };
public bool Test(int value)
{
    foreach (var handler in handlers)
    {
        if (handler.Invoke(value) == true)
        {
             return true;
        }
    }
    return false;
}

c#委托引用数组

您可以这样做,而不是创建这个处理程序数组:

private static IEnumerable<Func<int,bool>> GetHandlers()
{
    yield return firstMethod;
    yield return secondMethod;
    yield return thirdMethod;
}

现在您有了一种方法来获得实际的字段引用,以便可以为单元测试替换它们,但也有一种方法来遍历所有处理程序。也就是说,可以被替换的委托数组基本上是一个接口或一组可以被覆盖的抽象方法。如果您使用为提供多态性而设计的语言特性来实现多态性,那么它可能会更清晰、更易于维护。为了在单元测试期间方便地使用委托交换行为,您可以使用mock框架(如Moq)来模拟接口,而不必编写特定的测试类。