Quelle est la différence entre l'utilisation d'un PropertyDescriptor
qui renvoie une valeur pour la méthode IsReadOnly()
et une qui est associée à un ReadOnlyAttribute
?ReadOnlyAttribute vs PropertyDescriptor.IsReadOnly()
Répondre
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
.
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);
}
}
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 !!!!
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? –
C'est exact. –