您的位置:首页 > 运维架构

如何在程序运行中动态改变对象属性在PropertyGrid可见性和只读属性

2009-10-23 20:07 645 查看
以下两个方法分别实现可见性和只读属性的动态改变:

void SetPropertyVisibility(object obj, string propertyName, bool visible)
{
Type type = typeof(BrowsableAttribute);
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
AttributeCollection attrs = props[propertyName].Attributes;
FieldInfo fld = type.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
fld.SetValue(attrs[type], visible);
}

void SetPropertyReadOnly(object obj, string propertyName, bool readOnly)
{
Type type = typeof(System.ComponentModel.ReadOnlyAttribute);
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
AttributeCollection attrs = props[propertyName].Attributes;
FieldInfo fld = type.GetField("isReadOnly", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance);
fld.SetValue(attrs[type], readOnly);
}

'上面是cs的代码 以下是自己改的vb代码 测试通过

Function SetPropertyVisibility(ByVal obj As Object, ByVal propertyName As String, ByVal visible As Boolean)

Dim mytype As Type = GetType(BrowsableAttribute)

Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(obj) '得到一个属性集

Dim attrs As AttributeCollection = props(propertyName).Attributes

Dim fld As FieldInfo = mytype.GetField("browsable", BindingFlags.Instance Or BindingFlags.NonPublic)

fld.SetValue(attrs(mytype), visible)

Return Nothing

End Function

'同一个类中调用的话 如下就OK了

SetPropertyVisibility(Me, "属性名称", True)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐