2010-08-13 2 views
1

Je travaille sur un code de validation et j'ai des problèmes avec mon code Linq."Filtrer" une collection avant de lancer une requête Linq

Ce que j'ai est une classe qui valide sur un attribut particulier (ValidationAttribute). Tout fonctionne bien, c'est-à-dire que la validation fonctionne avec une classe dont certaines propriétés sont décorées avec cet attribut (ou des sous-classes). Ce que je veux maintenant faire est de dire à ma classe "validator" d'ignorer toutes les propriétés marquées avec un autre attribut (appelons cela IgnoreAttribute). Donc, ma question est, comment puis-je trouver toutes les propriétés avec l'attribut de validation (pour lequel j'ai déjà un code) mais d'abord "filtrer" cette collection pour ignorer les propriétés qui ont l'attribut ignorer (ou en fait une liste collection).

Le code pour la validation ressemble:

from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>() 
        from attribute in prop.Attributes.OfType<ValidationAttribute>(). 
        where attribute.IsValid(prop.GetValue(instance)) == false 
        select new ...etc 

Je veux ce code d'ignorer tous les attributs contenus dans une liste que j'ai dans la classe, soit une sorte de filtrage sur l'ensemble original ...

Des idées?

MISE À JOUR:

Je suppose que ma question est la suivante: Si j'ai une classe qui a ses propriétés décorées avec des attributs tels que:

class MyClass 

[Required] 
public string MyProp { get; set; } 

[Required] 
[Ignore] 
public string MyProp2 { get; set; } 

Comment puis-je trouver toutes les propriétés avoir l'attribut de validation (requis hérite de cela)) mais pas l'attribut ignore? Bien que je ne voulais vraiment pas ignorer une liste d'attributs et pas seulement l'attribut ignore.

Répondre

1

a pas?

from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>() 
where !prop.Attributes.OfType<IgnoreAttribute>().Any() 
from attribute in prop.Attributes.OfType<ValidationAttribute>(). 
where attribute.IsValid(prop.GetValue(instance)) == false 
select new ...etc 
+0

Oui, ça a marché ... pourquoi n'ai-je pas pensé à ça..bummer? Merci et désolé pour la réponse tardive! –

1

Avez-vous besoin du modèle flexible PropertyDescriptor? Assez facile avec la réflexion:

var filtered = instance.GetType().GetProperties() 
     .Where(prop => !Attribute.IsDefined(prop, typeof(IgnoreAttribute))); 

Ou faire la chose:

var invalid = from prop in instance.GetType().GetProperties() 
        where !Attribute.IsDefined(prop, typeof(IgnoreAttribute)) 
        let valAttribs = Attribute.GetCustomAttributes(
          prop, typeof(ValidationAttribute)) 
        where valAttribs != null && valAttribs.Length > 0 
        let value = prop.GetValue(instance, null) 
        from ValidationAttribute valAttrib in valAttribs 
        where !valAttrib.IsValid(value) 
        select new {}; 
+0

Ce que je veux vraiment est d'avoir une collection (de tous les attributs de validation) mais si cette propriété est également décorée avec un des attributs dans une autre liste des attributs qu'il est censé ignorer ... plus clair ?? Il n'a vraiment rien à voir avec les attributs juste filtrage Linq –

+0

@Johan - exactement; IsDefined supprime ces propriétés plus tôt. La mise à jour est-elle plus claire? –

Questions connexes