实施IComparable<>在密封的结构中,用于在通用函数中进行比较

时间:2010-10-07 18:46:28

标签: c# generics

我有一个C#.net 2.0 CF应用程序,我正在验证对象的返回值。我无法修改此结构或返回它的函数。

/// This structure is returned by a function from the object under test
public struct SomeType
{
    int a;
    int b;
    char c;
    string d;

    public static SomeType Empty { get { return new SomeType(); } }
}

/// pretend this function is in the object under test
static SomeType FunctionUnderTest()
{
    return SomeType.Empty;
}

由于我可能必须为返回许多不同类型的许多函数执行此操作,因此我想使用通用比较函数。这是可以修改的。

static bool Compare<T>(ValidationTypes ValidateCond,
    T ActualValue,
    T ExpectedValue) where T : System.IComparable<T>
{
    switch (ValidateCond)
    {
        case ValidationTypes.Equal:
            return ActualValue.CompareTo(ExpectedValue) == 0;
        case ValidationTypes.NotEqual:
            return ActualValue.CompareTo(ExpectedValue) != 0;
        case ValidationTypes.LessThan:
            return ActualValue.CompareTo(ExpectedValue) < 0;
        // more interesting things...
    }
    return false;
}

但是,这意味着从被测试函数返回的结构必须实现System.IComparable&lt;&gt;接口。我正在考虑这样的事情,这显然不会起作用,因为结构是密封的,但应该让你知道我在寻找什么:

/// our test creates a custom version of this structure that derives from
/// the System.IComparable<> interface.
public class SomeTypeUnderTest : SomeType, System.IComparable<SomeTypeUnderTest>
{
    #region IComparable<SomeTypeUnderTest> Members

    public int CompareTo(SomeTypeUnderTest other)
    {
        // insert some comparison function between object and this

        return 0;
    }

    #endregion
}

因此,我可以这样使用它:

bool res = Type<int>(ValidationTypes.Equal, 1, 2);

bool res2 = Type<SomeTypeUnderTest>(ValidationTypes.Equal, 
    new FunctionUnderTest(), 
    new SomeType.Empty);

如果有人对如何正确地执行此操作有任何建议,请告诉我。

谢谢, PaulH

2 个答案:

答案 0 :(得分:3)

您是否考虑过为您的结构实施IComparer<T>界面?

该类型本身不会实现比较。如果要比较两个值,可以使用IComparer&lt; T&gt;。实例而不是。

int result1 = Comparer<int>.Default.Compare(1, 2);
                         // the Default comparer defaults
                         // to IComparable<T>.CompareTo

int result2 = new SomeTypeComparer().Compare(FuncUnderTest(), SomeType.Empty);

答案 1 :(得分:0)

我建议为static bool Compare()引入一个新参数,它的类型为Comparison(委托int比较(T a,T b))或IComparer,可以调用它而不是value.CompareTo