簡體   English   中英

C#委托為對象

[英]C# Delegate as object

免責聲明:此問題的單元測試相關信息並不真正相關 - 如果您對此不熟悉,可以跳到“問題” ,但它有助於設置上下文。

我有一個我需要進行單元測試的課程。 它看起來像這樣:

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

我想使用NUnit 參數化單元測試來測試所有這些方法。 這是測試方法:

    [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並返回void

我嘗試了什么 (和 失敗 成功了):

 [...]
 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 },
          };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM