如何指定用泛型来验证这种情况?

时间:2012-03-28 20:52:54

标签: c# generics

我正在尝试验证此课程:min >= max。我意识到使用泛型我不能使用比较器。

这是我的通用课程。

public class Range<T>
{
    public T MinValue { get; set; }
    public T MaxValue { get; set; }

    public Range() { }

    public Range(T min, T max)
    {
        this.MinValue = min;
        this.MaxValue = max;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;

        var other = obj as Range<T>;
        return this.MinValue.Equals(other.MinValue) &&
               this.MaxValue.Equals(other.MaxValue);
    }

    public override string ToString()
    {
        return string.Format("{0},{1}", this.MinValue, this.MaxValue);
    }
}

T数据类型只能是数字,有没有办法只接受数字并接受<=

2 个答案:

答案 0 :(得分:11)

不,您不能将通用符号限制为数字,但您可以将T约束为IComparable<T>,然后使用CompareTo()

public class Range<T> where T : IComparable<T>
{
    ....
}

然后你可以说:

if (min.CompareTo(max) >= 0)...

抛出验证异常或您想要的任何验证。您可以使用相同的东西来确保值为&gt; = min和&lt; = max。

if (value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0)...

答案 1 :(得分:1)

public class Range<T> where T : IComparable<T>
{
    ...

    public bool Check(T value)
    {
        return value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0;
    }
}

如果您的范围在0到10之间,并希望0到10失败(排除最小和最大) - 只需将“&gt; =”替换为“&gt;”和“&lt; =”与“&lt;”。

我还建议更改等号覆盖:

return this.MinValue.Equals(other.MinValue) &&
       this.MaxValue.Equals(other.MaxValue);

到此:

return this.MinValue.CompareTo(other.MinValue) == 0 &&
       this.MaxValue.CompareTo(other.MaxValue) == 0;
相关问题