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是针对类型的,而类型的信息在反射的时候才能被获取,所以要使用特性就必须使用到反射。
posted @ 2008-01-22 11:01  BigRain  阅读(367)  评论(0编辑  收藏  举报