使用反射修改对象属性注意事项
作者:晓染霜林醉 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
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
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