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
  • 相关阅读:
    进程的常用方法
    进程创建&僵尸进程&孤儿进程
    进程基础
    操作系统的发展史
    UDP协议&socketserver模块
    socket套接字
    简述计算机网络
    day 7-8 协程
    __new__和__init__的区别
    day 7-22 进程,线程,协程
  • 原文地址:https://www.cnblogs.com/DivClose/p/1777723.html
Copyright © 2011-2022 走看看