1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| public sealed class CodeNumerique3 : CodeString
{
public CodeNumerique3(string code)
: base(code, 3, EConditionRegex.Numerique)
{
}
static public implicit operator CodeNumerique3(string valeur)
{
return new CodeNumerique3(valeur);
}
}
public abstract class CodeString : ICodeValeur
{
#region Interne Enum
protected enum EConditionRegex : byte
{
Aucune = 0,
Alpha,
Numerique,
Alphanumerique
}
#endregion
#region Attributs
private readonly string m_valeur;
private readonly EConditionRegex m_filtreRegex;
private readonly int m_longueur;
#endregion
#region Propriétés
public string ValeurCode
{
get { return m_valeur; }
}
#endregion
#region Constructeurs
protected CodeString(string valeur, int longueur, EConditionRegex filtre)
{
//----- Validation des paramètres -----
if (valeur == null) throw new ArgumentNullException("code");
//-----
m_longueur = longueur;
m_valeur = valeur;
m_filtreRegex = filtre;
if (!EvaluerSurLaContrainte(valeur)) throw new ArgumentOutOfRangeException("valeur", valeur, "La valeur ne satisfait pas la contrainte de format.");
}
#endregion
#region Méthodes
/// <summary>
/// Evalue si la valeur est valide par rapport à la contrainte de format.
/// </summary>
/// <param name="valeur">La valeur à valider.</param>
/// <returns>Le résultat de l'évaluation. VRAI si la valeur satisfait la contrainte, FAUX sinon.</returns>
protected virtual bool EvaluerSurLaContrainte(string valeur)
{
#if DEBUG
string l_patron = GenererPatronRegex();
return System.Text.RegularExpressions.Regex.IsMatch(valeur, l_patron, System.Text.RegularExpressions.RegexOptions.Compiled);
#else
return System.Text.RegularExpressions.Regex.IsMatch(valeur, GenererPatronRegex(), System.Text.RegularExpressions.RegexOptions.Compiled);
#endif
}
protected virtual string GenererPatronRegex()
{
StringBuilder l_patron = new StringBuilder();
bool l_longueurFixe = (m_longueur > 0);
const string FORMAT_PATRON = @"\A{0}{1}\z";
string l_classe;
string l_quantite;
if (l_longueurFixe) l_quantite = string.Concat(@"{", m_longueur, @"}");
else l_quantite = @"*";
switch (m_filtreRegex)
{
case EConditionRegex.Alpha:
l_classe = @"[^\W\d]";
break;
case EConditionRegex.Numerique:
l_classe = @"\d";
break;
case EConditionRegex.Alphanumerique:
l_classe = @"\W]";
break;
case EConditionRegex.Aucune:
default:
l_classe = @".";
break;
}
l_patron.AppendFormat(FORMAT_PATRON, l_classe, l_quantite);
return l_patron.ToString();
}
public override string ToString()
{
return m_valeur;
}
public override int GetHashCode()
{
return m_valeur.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType()) return false;
CodeString l_code = (CodeString)obj;
return (m_valeur == l_code.m_valeur);
}
#endregion
#region Opérateurs
static public bool operator ==(CodeString code1, CodeString code2)
{
return (code1.m_valeur == code2.m_valeur);
}
static public bool operator !=(CodeString code1, CodeString code2)
{
return (code1.m_valeur != code2.m_valeur);
}
static public implicit operator string(CodeString code)
{
return code.m_valeur;
}
//A Implémenter dans les classes descendantes :
//static public implicit operator CodeString(string valeur)
//{
// return new CodeString(valeur);
//}
#endregion
} |
Partager