C# 属性及其用途
C#中的属性及其使用
属性是指将关于类型或方法的信息嵌入到描述该类型或方法的元数据中的一种方式。通常,属性用于描述类型或方法的机制,而不是类型或方法的含义。例如,假设你有一个Employee类型。关于Employee的含义的一个事实是它是Person的一种,Employee有一个Manager等等。关于Employee的机制的一个事实是它可以作为数据绑定的目标,或者可以被序列化到磁盘上。员工本身不能被序列化到磁盘上,但是Employee类可以。属性允许你将有关技术细节与语义模型分离。
是的,你可以创建自己的属性。创建一个继承自Attribute的类,按照惯例将其命名为"FooAttribute"。如果这样做,你可以自由选择使用[Foo]语法或[FooAttribute]语法。
要判断字段/方法/类或其他对象是否具有特定的属性,或者要获取这些属性中设置的值,可以使用反射对象上的GetCustomAttributes方法。
要获取更多信息,可以从属性教程开始阅读,然后阅读C#规范的第17章。
C#属性及其用途
属性是附加到代码不同部分的元数据,可以查询和影响特定操作的行为。
属性可以应用于代码的几乎每个方面。例如,可以将属性应用于程序集级别,比如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;} }
当代码编译时,除了编译器生成自定义属性定义的额外元数据外,几乎没有其他影响。然而,现在可以编写一个PersistenceManager,可以动态检查Person类实例的属性,并将数据插入到People表中,将FirstName属性的数据映射到fname列,将LastName属性的数据映射到lname列。
至于关于属性实例的问题,属性的实例并不为类的每个实例创建。所有的People实例将共享TableMappingAttribute和ColumnMappingAttribute的同一个实例。事实上,只有在第一次查询属性时才会创建属性实例。
这就是关于C#属性及其用途的内容。
C#中的Attributes及其用途
Attributes是一种在.NET中将元数据与类型相关联的方法。这使得您可以检查类型并获取与其"运行时"信息分离的信息。
这非常有用。您提到了[Serializable],但其他简单的例子包括许多System.ComponentModel类型,例如Description,它被属性网格用于在设计时"描述"属性。由于属性的"描述"与类型在程序中的行为(在运行时)并不真正相关,它不属于类。然而,当您在可视化设计器中编辑控件时,看到属性的描述(或类别等)非常方便。Attributes是处理这种情况的方法。
您可以通过继承自System.Attribute类并指定其作用域来创建自己的attribute。要查询使用该attribute装饰的类/方法,可以使用反射如下:
foreach (var attrib in typeof(YOURCLASS).GetCustomAttributes())