using System;
using System.Reflection;
//第一步:定义属性类。
//AttributeUsage属性向编译器指出自定义属性的合法应用范围。
//所有编译器都内建对这个属性的支持,并会在用户自定义属性应用于一个无效目标的时候报告错误。
//定义您自己的特性类时,可通过在特性类上放置 AttributeUsageAttribute 来控制特性类的使用方式。指示的特性类必须直接或间接地从 Attribute 派生。
//
//特性类具有定位参数和命名参数。特性类的每个公共构造函数为该类定义一个有效的定位参数序列。命名参数则由特性类的非静态、公共和读写字段或属性定义。
//
//通过定义以下参数设置 AttributeUsageAttribute 的三个属性:
//
//ValidOn
//该定位参数指定可在其上放置所指示的特性的程序元素。AttributeTargets 枚举数中列出了可在其上放置特性的所有可能元素的集合。
//可通过按位“或”运算组合多个 AttributeTargets 值,以获取所需的有效程序元素组合。默认值为 All。
//
//AllowMultiple
//该命名参数指定能否为给定的程序元素多次指定所指示的特性,
//如果允许指定多个实例,则为 true;否则为 false。默认值为 false,属性就只能向一个选定的属性目标应用一次。
//
//Inherited
//该命名参数指定所指示的属性能否由派生类和重写成员继承。
//如果该属性可由派生类和重写成员继承,则为 true,否则为 false。默认值为 true。
//可继承属性不会造成在托管模块中为派生类型生成额外的元数据。
//定义自己的属性类时,未应用一个AttributeUsageAttribute属性,编译器和CLR会认为该属性能应用与所有目标,
//向每个目标都只能应用一次,而且是可继承的。
//这些假定模拟了AttributeUsageAttribute类中的默任字段值
//AttributeUsage属性类的FCL源代码:
[Serializable]
[AttributeUsageAttribute(AttributeTargets.Class,Inherited = true)]
public sealed class AttributeUsageAttribute : Attribute
{
internal static AttributeUsageAttribute Default = new AttributeUsageAttribute(AttributeTargets.All);
internal Boolean m_allowMultiple = false;
internal AttributeTargets m_attributeTarget = AttributeTargets.All;
internal Boolean m_inherited = true;
public AttributeUsageAttribute(AttributeTargets validOn)
{
m_attributeTarget = validOn;
}
public Boolean AllowMultiple
{
get
{
return m_allowMultiple;
}
set
{
m_allowMultiple = value;
}
}
public Boolean Inherited
{
get
{
return m_inherited;
}
set
{
m_inherited = value;
}
}
public AttributeTargets ValidOn
{
get
{
return m_attributeTarget;
}
}
}
//[Flags]
//[Serializable]
//public enum AttributeTargets
//{
//}
//定义属性类的实例构造器、字段和properties 时,合法的数据类型集合限制为:
//Boolean,Char,Byte,Sbyte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,String,Type,Object
//或一个枚举类型,还可以使用一个基于零的一维数组。
//[Flags]
[Serializable]
public class MyAttribute
{
private string name;
MyAttribute(String name)
{
name = name;
}
}