介绍属性和定义属性
介绍属性
属性为访问自定义类型的注释信息提供通用的访问方式。注释信息是随意的,换句话说,这种信息不是语言自身固有的,而是由你自己能够想象到的任何信息。你能使用属性(attributes)定义设计时信息(诸如文档)、运行时信息(诸如数据库字段名)、以及运行时行为特征(诸如假设成员是事务处理,或者能够参与事务处理)。在某种意义上,关联信息遵循与使用XML开发相同的原理。因为你能创建一个基于你所需的任何信息的属性,现有的一个标准机制适用定义属性自身和适合于查询成员或类型在运行时关于它们的附加属性。利用属性(attributes),我们能给类成员添加附加信息,因此我们能拥有一个完全自声明的组件。
简单地在目标类型或成员前面的中括号([])指定属性数据,可以向C#类型或成员附加上一个定义属性。
定义属性
属性(Attribute)实际是一个从类System.Attribute派生的类。类System.Attribute包含了一些为访问和测试定制属性的有用的方法。
当给一个类型或成员附加上属性时,不用包含后缀Attribute。这是一种快捷方式,由C#语言的设计者协助插入。当编译器发现一个属性是附加在类型或成员上的时,自动用指定的属性名检索System.Attribute派生类。若编译器不能定位类,编译器将向指定的属性名追加Attribute。因而,定义属性类的通用惯例是:定义属性类时已Attribute结尾,并且省略部分名称。
示例:
using System;
using System.Reflection;
public enum RegHives
{
HKEY_CLASSES_ROOT,
HKEY_CURRENT_USER,
HKEY_LOCAL_MACHINE,
HKEY_USERS,
HKEY_CURRENT_CONFIG
}
public class RegKeyAttribute : Attribute
{
public RegKeyAttribute(RegHives Hive, String ValueName)
{
this.Hive = Hive;
this.ValueName = ValueName;
}
protected RegHives hive;
public RegHives Hive
{
get { return hive; }
set { hive = value; }
}
protected String valueName;
public String ValueName
{
get { return valueName; }
set { valueName = value; }
}
}
[RegKey(RegHives.HKEY_CURRENT_USER, "SomeClass")]
class SomeClass
{
public int Foo;
public int Bar;
}
public class TestResKeyAttribute
{
public static void Main()
{
}
}
using System.Reflection;
public enum RegHives
{
HKEY_CLASSES_ROOT,
HKEY_CURRENT_USER,
HKEY_LOCAL_MACHINE,
HKEY_USERS,
HKEY_CURRENT_CONFIG
}
public class RegKeyAttribute : Attribute
{
public RegKeyAttribute(RegHives Hive, String ValueName)
{
this.Hive = Hive;
this.ValueName = ValueName;
}
protected RegHives hive;
public RegHives Hive
{
get { return hive; }
set { hive = value; }
}
protected String valueName;
public String ValueName
{
get { return valueName; }
set { valueName = value; }
}
}
[RegKey(RegHives.HKEY_CURRENT_USER, "SomeClass")]
class SomeClass
{
public int Foo;
public int Bar;
}
public class TestResKeyAttribute
{
public static void Main()
{
}
}