Eliminar el atributo C # de una propiedad dinámicamente

Tengo una clase con un conjunto de propiedades Como se indica a continuación.

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

Los objetos de esta clase se asignan a una cuadrícula de propiedades para que los usuarios puedan actualizar un contacto existente . puede ver que Mobile está marcado como ReadOnly.

Pero, cuando quiero agregar un Contacto completamente nuevo , me gustaría que los usuarios también puedan editar el contacto Móvil. Para eso necesito eliminar dinámicamente la propiedad Readonly del tipo, antes de asignar el objeto a la cuadrícula de propiedades. ¿Es posible?

No puede eliminar el atributo en tiempo de ejecución, pero puede usar el reflection para cambiar el campo de respaldo privado ReadOnly del atributo ReadOnly a False. Haciéndolo equivalente a [ReadOnly (false)]

Vea este artículo para más detalles:

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

Editar: enlace fijo

Tengo que estar de acuerdo con Omu; en realidad estás hablando de dos clases (ver modelos) en este caso, para apoyar tus dos vistas diferentes. Algo como

CreateContactViewModel y EditContactViewModel

no es posible en este momento eliminar atributos dinamycally (en tiempo de ejecución)

como sugerencia puedes hacer 2 clases: una con los atributos y otra sin

Seguí la sugerencia de Legenden. Aquí es lo que se me ocurrió

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

El blog de CodingLight.com se movió a blogspot (el enlace de arriba está roto). Ver http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html .

Además, el seguimiento de SysAdmin no mencionó el [RefreshProperties(RefreshProperties.All)] que parece ser necesario para una solución que realmente funciona.

Finalmente, creo que incluso David Morton (autor del artículo citado) perdió una cosa muy importante: si la clase ( ContactInfo , en el ejemplo de seguimiento de SysAdmin) no tiene al menos una propiedad con el atributo [ReadOnly] definido en tiempo de comstackción, luego, cuando “isReadOnly” FieldInfo se establece en true en el tiempo de ejecución, el resultado es que toda la clase se convierte en de solo lectura.