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

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

2012-07-30 11:23 375 查看
以下两个方法分别实现可见性和只读属性的动态改变:

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)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/departure19841030/archive/2009/10/24/4720452.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐