[英]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.