Remove C# attribute of a property dynamically

后端 未结 5 1664
不思量自难忘°
不思量自难忘° 2020-11-30 09:18

I have a class with a set of properties As given below.

class ContactInfo
{
    [ReadOnly(true)]
    [Category(\"Contact Info\")]
    public string Mobile {          


        
相关标签:
5条回答
  • 2020-11-30 09:39

    I have to agree w/ Omu; you're really talking about two classes (view models) in this case, to support your two different views. Something like

    CreateContactViewModel and EditContactViewModel

    0 讨论(0)
  • 2020-11-30 09:40

    You can not remove the attribute at runtime, but you can use reflection to change the ReadOnly attribute's ReadOnly private backing field to False. Making it the equivalent of [ReadOnly(false)]

    See this article for details:

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

    Edit: fixed link

    0 讨论(0)
  • 2020-11-30 09:41

    The CodingLight.com blog moved to blogspot (the above link is broken). See http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html.

    Moreover, SysAdmin's followup did not mention the [RefreshProperties(RefreshProperties.All)] attribute that seems to be necessary for an actually-working solution.

    Finally, I believe that even David Morton (author of the quoted article) missed one very important thing: if the class (ContactInfo, in SysAdmin's followup example) does not have at least one property with the [ReadOnly] attribute defined at compile time, then when the "isReadOnly" FieldInfo is set to true at runtime the result is that the whole class turns read-only.

    0 讨论(0)
  • 2020-11-30 09:53

    I followed up the suggestion by Legenden. Here is what I came up with

    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);
            }
    }
    
    0 讨论(0)
  • 2020-11-30 10:00

    it's not possible at the moment to remove attributes dinamycally (at runtime)

    as a suggestion you can do 2 classes: one with the attributes and one without

    0 讨论(0)
提交回复
热议问题