使用反射修改对象属性注意事项

使用反射修改对象属性注意事项

作者:晓染霜林醉     QQ:51817    Email:pyeye@126.com          转载请注明出处

大家都知道采用下面的代码,可以实现动态设置对象属性的可见性,使用方法是:

SetPropertyVisibility(obj , “属性名称”, true/false)

设置对象属性的可见属性
1 Public Sub SetPropertyVisibility(obj As Object, propertyName As String, visible As Boolean)
2 Dim type As Type = GetType(BrowsableAttribute)
3 Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(obj)
4 Dim attrs As AttributeCollection = props(propertyName).Attributes
5 Dim fld As FieldInfo = type.GetField("browsable ", BindingFlags.Instance Or BindingFlags.NonPublic)
6 fld.SetValue(attrs(type), visible)
7  End Sub
8  

这里面有一条是特别需要注意的:这个函数是查找对象的元数据中的字段,从而进行属性的设置的,因此如果对象的属性中不带有browsable(true/false),这个函数就不能对他进行操作,而且会导致没有这个browsable参数的其他属性都没误导。正确的做法是,当你需要使用这个函数的时候,就在每个属性里面都增加上browsable,及时默认是browsable(true),也有必要这样做。类似的函数是:

设置对象属性的只读属性
1 Private Sub SetPropertyReadOnly(obj As Object, propertyName As String, [readOnly] As Boolean)
2 Dim type As Type = GetType(System.ComponentModel.ReadOnlyAttribute)
3 Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(obj)
4 Dim attrs As AttributeCollection = props(propertyName).Attributes
5 Dim fld As FieldInfo = type.GetField("isReadOnly", BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.CreateInstance)
6 fld.SetValue(attrs(type), [readOnly])
7 End Sub
8
原文地址:https://www.cnblogs.com/DivClose/p/1777723.html