我认为以下问题的答案将为您提供一些关于您的问题的见解。
How do attribute classes work?
这是我提供的答案的转贴。
属性本质上是元数据,可以附加到代码的各个部分。然后可以查询此元数据并影响某些操作的行为。
属性几乎可以应用于代码的每个方面。例如,属性可以在程序集级别关联,如 AssemblyVersion 和 AssemblyFileVersion 属性,它们控制与程序集关联的版本号。
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
然后,例如可以将 Serializable 属性应用于类型声明,以将类型标记为支持序列化。事实上,这个属性在 CLR 中具有特殊含义,实际上作为特殊指令直接存储在 IL 中的类型上,这经过优化以存储为可以更有效地处理的位标志,有一些属性这种性质,称为伪自定义属性。
仍然可以将其他属性应用于方法、属性、字段、枚举、返回值等。您可以通过查看此链接了解属性可以应用于的可能目标
http://msdn.microsoft.com/en-us/library/system.attributetargets(VS.90).aspx
除此之外,您还可以定义自己的自定义属性,然后将这些属性应用于您的属性所针对的适用目标。然后在运行时,您的代码可以反映自定义属性中包含的值并采取适当的措施。
举一个相当幼稚的例子,这只是为了举例:)
您可能想要编写一个持久性引擎,该引擎将自动将类映射到数据库中的表,并将类的属性映射到表列。您可以从定义两个自定义属性开始
TableMappingAttribute
ColumnMappingAttribute
然后你可以将它应用到你的类中,例如我们有一个 Person 类
[TableMapping("People")]
public class Person
{
[ColumnMapping("fname")]
public string FirstName {get; set;}
[ColumnMapping("lname")]
public string LastName {get; set;}
}
编译时,除了编译器发出由自定义属性定义的附加元数据这一事实外,几乎没有其他影响。但是,您现在可以编写一个 PersistanceManager,它可以动态检查 Person 类实例的属性并将数据插入到 People 表中,将 FirstName 属性中的数据映射到 fname 列,将 LastName 属性映射到 lname 列。
关于你关于属性实例的问题,属性的实例不是为你的类的每个实例创建的。 People 的所有实例将共享同一 TableMappingAttribute 和 ColumnMappingAttributes 实例。实际上,属性实例只有在您第一次真正查询属性时才会创建。