我有一组具有一组属性的类如下所示。
class ContactInfo
{
[ReadOnly(true)]
[Category("Contact Info")]
public string Mobile { get; set; }
[Category("Contact Info")]
public string Name{ get; set; }
}
此类的对象正在分配给属性网格,以便用户可以更新现有联系人。你可以看到Mobile被标记为ReadOnly。
但是,当我想添加全新联系时,我希望用户也可以编辑联系人手机。为此,我需要在将对象分配给属性网格之前从Type中动态删除Readonly属性。有可能吗?
答案 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时,结果是整个类变为只读。