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

以下两个方法分别实现可见性和只读属性的动态改变:

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)

你可能感兴趣的:(vb.net)