2009-09-26 4 views

Répondre

0

Vous pouvez affecter le type de classe MyRegEx au lieu de l'instance de la regex, voici l'idée ci-dessous.

public interface IRegexProvider 
{ 
    Regex Regex { get; } 
} 

public class RegularExpressionAttribute : Attribute 
{ 
    public readonly Type _factory; 

    public RegularExpressionAttribute(Type regexFactory) 
    { 
     _factory = regexFactory; 
    } 

    public Regex Regex 
    { 
     get 
     { 
      // you can cache this 
      var factory = (IRegexProvider)Activator.CreateInstance(_factory); 
      return factory.Regex; 
     } 
    } 
} 

// using 

public class MyRegex : IRegexProvider 
{   
    public Regex Regex 
    { 
     get 
     { 
      return new Regex(@"^\s*\d+(\.\d{1,2})?\s*$");   
     } 
    }   
} 

[RegularExpression(typeof(MyRegex))] 
+0

Merci - avez-vous essayé? Il ne compile pas - ne peut pas assigner l'attribut au type générique? – Davy

+0

Je ne suis pas fatigué de le compiler (il n'y avait pas de VS disponible) il est réparé maintenant. La version ci-dessus se compile maintenant. –

+0

Merci shay - Je devrais avoir posté cela plus tôt mais je m'amuse à utiliser cela avec DataAnnotations aussi, est-il possible d'utiliser cette tête de celle qui attend une chaîne? - sry très nouveau à cela. – Davy

2

Il est impossible d'ajouter une instance de Regex à un attribut parce que vous avez dit, attribuer les arguments doivent être des valeurs constantes. Il n'y a aucun moyen de contourner cette limitation car c'est une limitation du CLR/CLI. Le mieux que vous pouvez faire est de prendre des valeurs de chaîne qui sont converties en Regex sous le capot dans le constructeur d'attributs.

public class RegularExpressionAttribute : Attribute { 
    public readonly string StringValue; 
    public readonly Regex Regex; 
    public RegularExpressionAttribute(string str) { 
    StringValue = str; 
    Regex = new Regex(str); 
    } 
} 
Questions connexes