簡體   English   中英

在C#中使用setter作為參數? (也許與代表?)

[英]Using a setter as a parameter in C#? (Maybe with delegate?)

我們正在為一些硬件開發API,我正在嘗試用C#編寫一些測試。 用於重復性任務的try-catch塊使我的代碼變得臃腫和重復,所以對於getter我能夠像這樣包裝:

TestGetter(Func<int> method, double expectedVal)
{
    int testMe = 0;
    try
    {
        testMe = method();
        PassIfTrue(testMe == expectedVal);
    }
    catch (Exception e)
    {
         Fail(e.Message);
    }
}

所以我查詢硬件的某些已知值並進行比較。 我可以打電話:

TestGetter( () => myAPI.Firmware.Version, 24); //Or whatever.

哪個效果很好。 但我不確定如何對setter做同樣的事情。 即確保API實際設置一個值(並且在我嘗試設置時不會超時或任何其他情況)。 我想將setter傳遞給test方法並在那里調用它。

獎金問題:有沒有辦法用通用類型做到這一點? API中定義了一些自定義類型,我不確定為它們編寫這些測試包裝器的好方法,而無需為每種類型編寫新的重載方法。 感謝您的幫助!

你可以將getter和setter傳遞給函數:

void TestSetter<T>(Func<T> getter, Action<T> setter, T value)
{
    try
    {
        setter(value);
        PassIfTrue(EqualityComparer<T>.Default.Equals(getter(), value));
    }
    catch (Exception e)
    {
         Fail(e.Message);
    }       
}

這將設置值,然后獲取它並與傳遞給setter的值進行比較。

你必須把它稱為:

TestSetter(() => myAPI.Firmware.Version, v => myAPI.Firmware.Version = v, 24);

您可以像Reeds一樣使它們具有通用性,但您需要使用不同的比較方法:

    public static void TestGetter<T>(Func<T> method, T expectedVal)
    {       
        try
        {
            T actual = method();
            PassIfTrue(expectedVal.Equals(actual));
        }
        catch (Exception ex)
        {
            Fail(ex.Message);
        }
    }

    public static void TestSetter<T>(Action setMethod, Func<T> getMethod, T expectedVal)
    {
        try
        {
            setMethod();
            T actual = getMethod();
            PassIfTrue(expectedVal.Equals(actual));
        }
        catch (Exception ex)
        {
            Fail(ex.Message);
        }
    }

如果您認為Equals方法不適用於預期類型,您也可以傳入Comparer操作來測試它們。

暫無
暫無

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

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