4 votes

Comment spécifier pour valider cette situation avec des génériques ?

J'essaie de valider cette classe : min >= max . J'ai réalisé qu'en utilisant les génériques, je ne peux pas utiliser les comparateurs.

C'est ma classe générique.

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);
    }
}

Le type de données T ne peut être que des nombres, existe-t-il un moyen d'accepter uniquement des nombres et d'accepter l'attribut <= ?

11voto

James Michael Hare Points 19077

Non, vous ne pouvez pas contraindre les génériques aux nombres, mais vous pouvez contraindre T a IComparable<T> et ensuite utiliser CompareTo()

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

Alors vous pouvez dire :

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

Et lancer une exception de validation ou toute autre validation que vous souhaitez. Vous pouvez utiliser la même chose pour vous assurer que la valeur est >= min et <= max.

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

1voto

Yorye Nathan Points 7907
public class Range<T> where T : IComparable<T>
{
    ...

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

Si vous utilisez une plage comprise entre 0 et 10, et que vous voulez que 0, 10 échoue (excluant min et max) - remplacez simplement ">=" par ">" et "<=" par "<".

Je recommanderais également de modifier le remplacement de Equals par :

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

à ça :

return this.MinValue.CompareTo(other.MinValue) == 0 &&
       this.MaxValue.CompareTo(other.MaxValue) == 0;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X