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;
}
}
}
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;
}
}
}
{
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是针对类型的,而类型的信息在反射的时候才能被获取,所以要使用特性就必须使用到反射。
{
保存个性化的属性
}