Il y a un bidouille disponible à: How to Set Attribute Value at Runtime-- and How to Work around a Silly Bug
private void SetPropertyGrid()
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(typeof(Student))["Address"];
ReadOnlyAttribute attrib = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo isReadOnly = attrib.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
isReadOnly.SetValue(attrib,true);
propertyGrid1.SelectedObject = new Student();
}
J'ai pu à ce code pour modifier la valeur d'attribut ReadOnly
de la propriété. L'instruction propertyGrid1.SelectedObject = new Student();
peut être remplacée par propertyGrid1.SelectedObject = myStudent
, c'est-à-dire que vous pouvez modifier les propriétés d'un objet existant.
En outre, un coup d'oeil à une question similaire: Change Attribute's parameter at runtime
Remarque: vous ne pouvez pas modifier les attributs par réflexion. Vous pouvez * le faire en utilisant 'System.ComponentModel', mais cela ne fonctionne que si l'appelant * demande * via' System.ComponentModel'. Malheureusement * au niveau de la propriété * (plutôt que le niveau du type), il est difficile de le faire, et je pense qu'il est peu probable qu'il atteigne quoi que ce soit dans ce scénario (je suppose que l'appelant interroge par réflexion) –