动态删除属性的C#属性

时间:2010-03-20 13:11:38

标签: c# .net propertygrid

我有一组具有一组属性的类如下所示。

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

    [Category("Contact Info")]
    public string Name{ get; set; }
}

此类的对象正在分配给属性网格,以便用户可以更新现有联系人。你可以看到Mobile被标记为ReadOnly。

但是,当我想添加全新联系时,我希望用户也可以编辑联系人手机。为此,我需要在将对象分配给属性网格之前从Type中动态删除Readonly属性。有可能吗?

5 个答案:

答案 0 :(得分:7)

您无法在运行时删除该属性,但可以使用反射将ReadOnly属性的ReadOnly私有支持字段更改为False。使它等同于[ReadOnly(false)]

有关详细信息,请参阅此文章:

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

编辑:固定链接

答案 1 :(得分:2)

我必须同意Omu;在这种情况下,你真的在​​谈论两个类(视图模型),以支持你的两个不同的视图。像

这样的东西

CreateContactViewModel和EditContactViewModel

答案 2 :(得分:1)

目前无法动态删除属性(在运行时)

作为建议你可以做2个类:一个有属性,一个没有

答案 3 :(得分:0)

我跟进了Legenden的建议。这就是我想出来的

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);
        }
}

答案 4 :(得分:0)

CodingLight.com博客转移到blogspot(以上链接已损坏)。 请参阅http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html

此外,SysAdmin的后续内容没有提及实际工作解决方案似乎必需的[RefreshProperties(RefreshProperties.All)]属性。

最后,我相信即使David Morton(引用文章的作者)也错过了一件非常重要的事情:如果课程(ContactInfo,在SysAdmin的后续示例中)没有至少在编译时定义了[ReadOnly]属性的一个属性,然后在运行时将“isReadOnly”FieldInfo设置为true时,结果是整个类变为只读。