2009-04-16 8 views

Répondre

5

La principale différence est que cela vous permet de saisir plus de contrôle si vous fournissez votre propre implémentation PropertyDescriptor (via ICustomTypeDescriptor, TypeDescriptionProvider ou TypeConverter). Ensuite, vous pouvez choisir votre propre logique pour quand il est inscriptible - par exemple, en fonction des droits d'accès.

Mais oui; sous l'implémentation par défaut, il sera en lecture seule pour les propriétés sans setters, et pour les propriétés marquées ReadOnlyAttribute.

+1

Donc, disons que je crée mon propre PropertyDescriptor via ICustomTypeDescriptor alors la méthode IsReadOnly() remplacera tout ce qui a déjà été appliqué aux attributs ReadOnly? –

+0

C'est exact. –

3

Pas de différence quand je le regarde avec Reflector.

L'un de la classe dérivée SimplePropertyDescriptor a le code suivant.

 

    public override bool IsReadOnly 
    { 
     get 
     { 
      return this.Attributes.Contains(ReadOnlyAttribute.Yes); 
     } 
    } 
 
0

Juste une note.

J'ai passé une journée à implémenter ICustomTypeDescriptor pour les objets d'entité dans mon application, afin de contrôler individuellement l'état en lecture seule de chaque entité.

Ainsi, chaque mise en œuvre PropertyDescriptor a gardé une référence à l'objet de l'entité, il est venu, donc la propriété IsReadOnly était quelque chose comme ceci:

public override bool IsReadOnly 
{ 
    get { return _owner.IsReadOnly;} 
} 

Cependant, quand je courais le code du composant BindingSource lu un ensemble de PropertyDescriptor s de la méthode GetProperties() de ICustomTypeDescriptor pour chaque enregistrement de l'ensemble, cependant, lorsqu'il a vérifié la valeur de IsReadOnly, il a uniquement testé le PropertyDescriptor obtenu à partir du premier enregistrement.

Une perte de temps totale !!!!