gpt4 book ai didi

C# 委托(delegate)为对象

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:38 25 4
gpt4 key购买 nike

免责声明:这个问题的单元测试相关信息并不真正相关 - 如果您对此不熟悉,可以跳到“问题”,但它有助于设置上下文。

我有一个类需要进行单元测试。它看起来像这样:

public class NumberParser {
public static void CheckByteRange(string str){...}
[...]
public static void CheckFloatRange(string str){...}
[...]
}

我想使用一个 NUnit parametrized unit-test测试所有这些方法。测试方法如下:

    [TestCaseSource("CheckRange_Overflow_Inputs")]
public void CheckRange_Overflow(string value, Action<string> method)
{
Assert.Throws<Exception>(() => method(value));
}

测试使用 TestCaseSourceAttribute 指定一个字段,其中包含测试方法的参数集列表。

现在,NUnit 需要一个名为 CheckRange_Overflow_Inputs 的字段,类型为 object[],它本身包含 object[] 元素,每个元素包含测试方法的参数值。

问题:

理想情况下,我想这样写这个字段:

    private static readonly object[] CheckRange_Overflow_Inputs
= new object[]
{
new object[]{byte.MaxValue, NumberParser.CheckByteRange },
[...]
new object[]{float.MaxValue, NumberParser.CheckFloatRange },
[...]
};

但是编译器提示它不能将一个方法组转换为一个对象。

这是有道理的 - NumberParser.CheckByteRange 可能不明确,例如它可能会重载。

但是我怎样才能让编译器允许我保存(作为对象)名为 NumberParser.CheckByteRange 的方法,该方法采用 string 并返回 无效 ?

我尝试过的(失败成功):

 [...]
new object[]{byte.MaxValue, (Action<string>)NumberParser.CheckByteRange },
[...]

最佳答案

如果方法是 static ,那么您的尝试就会奏效。它不能像

(Action<string>)NumberParser.CheckByteRange

CheckByteRange是一个实例(非 static )方法,因为您没有告诉它要使用哪个实例( this )。所以要么:

  • 制作CheckByteRange进入static方法
  • 告诉它使用哪个实例,即 (Action<string>)someInstance.CheckByteRange

和他们一起static ,以下编译对我来说很好:

private static readonly object[] CheckRange_Overflow_Inputs
= new object[]
{
new object[]{byte.MaxValue, (Action<string>) NumberParser.CheckByteRange },
new object[]{float.MaxValue, (Action<string>) NumberParser.CheckFloatRange },
};

关于C# 委托(delegate)为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com