先看一個簡單的例子
[Table(Name="dbo.[User]")]
public partial class User
{
當C#編譯器發現這個屬性有一個特性Table時,首先會把字符串Attribute添加到這個名稱的後面,形成一個組合名稱TableAttribute,然後在其搜索路徑的所有命名空間中搜索有相同類名的類。但要注意,如果該特性名結尾是Attribute,編譯器就不會把該字符串加到組合名稱中。所有的特性都是從System.Attribute類型上面派生的。
接著我們來看一下Table特性的定制格式
[AttributeUsageAttribute(AttributeTargets.Class, Inherited=true,AllowMultiple=false)]
public class TalbeAttribute:Attribute
{
在定義類型時使用System.AttributeUsage特性來表明這個自定義特性的使用范圍,這裡使用了Class樣式,表示TableAttribute特性只能用在其它的Class類型前面,若放置在Interface或Struct類型前面,或者放在對象成員的前面則會出現編譯錯誤。這裡還是用語句 AllowMultiple=false 語句來表明對於一個類型,該特性只能用一次,若一個Class類型前面出現多個TableAttribute,則會出現編譯錯誤。若設置AllowMultiple=true,則該特性可以多次定義,也就是一個Class類型前面可以出現多個相同類型的特性。不過這裡我們假設一個對象只能映射到一個數據表上,沒有多重映射,因此就指明對同一個類型該特性不能多次使用。Inherited參數設定為true,就表示應用到類或接口上的特性也可以自動應用到所派生的類或接口上。
我們再看一下定制TalbeAttribute特性的完整例子:
[AttributeUsageAttribute(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class TableAttribute : Attribute
{
//保存表名的字段
private string _tableName;
public TableAttribute()
{
}
public TableAttribute(string tableName)
{
this._tableName = tableName;
}
/// <summary>
/// 映射的表名(表的全名:模式名.表名)
/// </summary>
public string TableName
{
set
{
this._tableName = value;
}
get
{
return this._tableName;
}
}
}