zoukankan      html  css  js  c++  java
  • 使用反射修改对象属性注意事项

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

    作者:晓染霜林醉     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
  • 相关阅读:
    Git 安装使用及基础命令
    Ubuntu Anaconda3 环境下安装caffe
    Anaconda 安装及Python 多版本间切换
    基于 ZooKeeper 的分布式锁实现
    java 判断点是否在一条线段上
    python 安装opencv及问题解决
    python Opencv图像基础操作
    sctf pwn200
    BCTF warmup 50
    linux shadow破解
  • 原文地址:https://www.cnblogs.com/DivClose/p/1777723.html
Copyright © 2011-2022 走看看