• Attribute 和 Reflection


    04年时刚接触到C#,对于Attribute感到特别稀奇,因为我翻遍了整个教程,也看不到关于Attribute的介绍,

    对于在代码上面用[]括起来,觉得神秘和不可思议。我们之前学C、C++或者java都没有这种东西。而且这些东

    西都不在代码的执行当中,用了有什么意义呢。不过有疑问归有疑问,要说明类是可序列化的,你还得在上面

    标示上[Serializable]。那时还不懂,当时只知道如果不加这个程序就编译不过去。渐渐的,不知不觉就知道

    了这个东西的用法了。Attribute大家一般都叫特性(为了区分C#中的属性)。System.Attribute也是一个类

    ,不过这个类好像有点特殊。如同System.Exception一样,所有的异常都要从Exception继承,所有的特性也

    要从Attribue继承。个人理解Attribute是对一个类型进行描述,或者说做一个标识。Attribute是属于类型的

    一部分,它不是属于类型对象的。

    要声明一个自己的Attribute其实很简单。

    [AttributeUsage(AttributeTargets.Property)]
        
        
    public class CustomPropertyAttribute : Attribute
        
    {
            
    private string name;
            
    /// <summary>
            
    /// 名称(xml序列化后的节点名称)
            
    /// </summary>

            public string Name
            
    {
                
    get
                
    {
                    
    return name;
                }

                
    set
                
    {
                    name 
    = value;
                }

            }

        }

    标识CustomPropertyAttribute的AttributeUsage本身也是一个Attribute.
    现在我们来看下它的使用
    public class MyUser : BigRain.Membership.User
    {
        
    public MyUser(string userID) : base(userID) { }
        
    public MyUser()
        
    {
            
    //
            
    // TODO: 在此处添加构造函数逻辑
            
    //
        }


        
    private Grate _Leval = Grate.Leval1;
        [CustomProperty(Name
    ="leval")]//枚举类型扩展
        public Grate Leval
        
    {
            
    get
            
    {
                
    return _Leval;
            }

            
    set
            
    {
                _Leval 
    = value;
            }

        }


        
    private int  _Age;

        [CustomProperty(Name
    ="age")]//简单值类型的扩展
        public int Age
        
    {
            
    get
            
    {
                
    return _Age;
            }

            
    set
            
    {
                _Age 
    = value;
            }

        }


        
    private string blog;
        [CustomProperty]
    //string的类型扩展
        public string Blog
        
    {
            
    get
            
    {
                
    return blog;
            }

            
    set
            
    {
                blog 
    = value;
            }

        }


        
    private Address _add;
        [CustomProperty]
    //简单对象的扩展
        public Address Address
        
    {
            
    get
            
    {
                
    if (_add == null)
                    _add 
    = new Address();
                
    return _add;
            }

            
    set
            
    {
                _add 
    = value;
            }

        }

    }

    是不是感觉有点熟悉了。当时这个东西是怎样为我们服务的呢。看下面的代码
    private void SaveProfile()
            
    {

                
    保存个性化的属性

            }
    因为Attribute是针对类型的,而类型的信息在反射的时候才能被获取,所以要使用特性就必须使用到反射。
  • 相关阅读:
    Qt 定时器事件startTimer
    认识网络、几种常用的网络拓扑图
    拓扑结构图,什么是拓扑结构
    Qt 利用QTime类来控制时间,QTime的成员函数的用法
    Qt QTime类的使用
    Qt 打开文件的默认路径 QFileDialog::getOpenFileName()
    Qt QWidget颜色设置的三种方法
    Qt 多个QDockWidget 切换显示
    Qt QString 格式化 arg 前面自动补0
    Qt 使用QMediaPlayer报错 defaultServiceProvider::requestService(): no service found for
  • 原文地址:https://www.cnblogs.com/Linjianyu/p/1048266.html
Copyright © 2020-2023  润新知