Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#委托引用数组_C#_Arrays_Delegates_Reference - Fatal编程技术网

c#委托引用数组

c#委托引用数组,c#,arrays,delegates,reference,C#,Arrays,Delegates,Reference,当引用其他类时,我们使用委托。在单元测试期间,我们覆盖这些值 我有一个类引用了20多个其他类,所以我想我应该创建一个委托数组。如果我创建这些委托的静态数组(请参见下面的代码),它将存储委托的值,而不是对委托的引用 因此,单元测试无法更新这些值。为了解决这个问题,当我想使用代理时,我已经创建了代理数组,但我希望下面的代码能够正常工作 private static Func<int, bool> firstMethod = ExternalClass1.Method; private s

当引用其他类时,我们使用委托。在单元测试期间,我们覆盖这些值

我有一个类引用了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;
}
private static Func firstMethod=ExternalClass1.Method;
私有静态Func secondMethod=ExternalClass2.Method;
私有静态Func thirdMethod=ExternalClass3.Method;
私有静态Func[]处理程序={first,second,third};
公共布尔测试(int值)
{
foreach(处理程序中的变量处理程序)
{
if(handler.Invoke(value)==true)
{
返回true;
}
}
返回false;
}

您可以执行以下操作,而不是创建此处理程序数组:

private static IEnumerable<Func<int,bool>> GetHandlers()
{
    yield return firstMethod;
    yield return secondMethod;
    yield return thirdMethod;
}
private静态IEnumerable GetHandlers()
{
收益率法;
收益率法;
收益率法;
}
现在您有了一种获取实际字段引用的方法,这样就可以在单元测试中替换它们,但也有了一种迭代所有处理程序的方法。也就是说,可以替换的委托数组基本上是可以重写的接口或抽象方法集。如果您使用为提供多态性而设计的语言特性来实现多态性,那么它可能会更干净、更易于维护。为了方便在单元测试期间使用委托交换行为,您可以使用Moq之类的模拟框架来模拟接口,而无需编写特定的测试类


-丹

那有什么问题?错误是什么?您是否考虑过在某些情况下使用接口而不是委托?我们使用CSLA,因此所讨论的方法是静态的。AIUI接口不能通过静态方法实现,因此该方法不是选项。谢谢。那看起来正是我想要的。