在 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.

效果很好。但我不确定如何对 setters 做同样的事情。即确保 API 实际设置了一个值(并且在我尝试设置时不会超时或其他任何情况)。我想将 setter 传递给测试方法并在其中调用它。

奖金问题:有没有办法用泛型来做到这一点? 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 操作来测试它们。