Supprimer dynamicment l’atsortingbut C # d’une propriété

J’ai une classe avec un ensemble de propriétés comme indiqué ci-dessous.

class ContactInfo { [ReadOnly(true)] [Category("Contact Info")] public ssortingng Mobile { get; set; } [Category("Contact Info")] public ssortingng Name{ get; set; } } 

Les objects de cette classe sont en cours d’affectation à une grid de propriétés afin que les utilisateurs puissent mettre à jour un contact existant . vous pouvez voir que Mobile est marqué en tant que ReadOnly.

Mais, lorsque je veux append un contact entièrement nouveau , je souhaite que les utilisateurs puissent également modifier le contact. Pour cela, il est nécessaire de supprimer dynamicment la propriété Readonly du Type avant d’affecter l’object à la grid de propriétés. C’est possible?

Vous ne pouvez pas supprimer l’atsortingbut au moment de l’exécution, mais vous pouvez utiliser la reflection pour définir le champ de support privé en lecture seule de l’atsortingbut ReadOnly sur False. Ce qui en fait l’équivalent de [ReadOnly (false)]

Voir cet article pour plus de détails:

http://codinglight.blogspot.com/2008/10/changing-atsortingbute-parameters-at.html

Edit: lien fixe

Je suis d’accord w / Omu; vous parlez vraiment de deux classes (modèles de vues) dans ce cas, pour prendre en charge vos deux vues différentes. Quelque chose comme

CreateContactViewModel et EditContactViewModel

il n’est pas possible pour le moment de supprimer les atsortingbuts dinamycalement (au moment de l’exécution)

à titre de suggestion, vous pouvez faire 2 classes: une avec les atsortingbuts et une sans

J’ai suivi la suggestion de Legenden. Voici ce que je suis venu avec

 class ContactInfo { [ReadOnly(true)] [Category("Contact Info")] public ssortingng Mobile { get; set; } [Category("Contact Info")] public ssortingng Name{ get; set; } public void SetMobileEdit(bool allowEdit) { PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this.GetType())["Mobile"]; ReadOnlyAtsortingbute atsortingb = (ReadOnlyAtsortingbute)descriptor.Atsortingbutes[typeof(ReadOnlyAtsortingbute)]; FieldInfo isReadOnly = atsortingb.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); isReadOnly.SetValue(atsortingb, !allowEdit); } } 

Le blog CodingLight.com a été transféré sur blogspot (le lien ci-dessus est rompu). Voir http://codinglight.blogspot.com/2008/10/changing-atsortingbute-parameters-at.html .

De plus, le suivi de SysAdmin n’a pas mentionné l’ [RefreshProperties(RefreshProperties.All)] qui semble être nécessaire pour une solution réellement opérationnelle.

Enfin, je pense que même David Morton (auteur de l’article cité) a oublié une chose très importante: si la classe ( ContactInfo , dans l’exemple suivant de SysAdmin) n’a pas au moins une propriété avec l’atsortingbut [ReadOnly] défini à la compilation puis, lorsque l’object FieldInfo “isReadOnly” est défini sur true à l’exécution, la classe entière devient alors en lecture seule.