繁体   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