新增乙個特性類:(其中attributeusage
)可以修飾此特性類可修飾的型別)類命名後面習慣以(attribute
)結尾,如類名display後面加attribute作為類名,就是displayattribute,此類要繼承attribute
,建立乙個建構函式,帶乙個(string
)引數,用以初始化乙個私有字段(自定義屬性的名稱),再加個公開返回此字段的方法:m
;
新增乙個屬性的擴充套件方法:靜態類+靜態方法,(this propertyinfo propertyinfo
),只要這乙個引數,判斷(propertyinfo.isdefined
)這個屬性如果有第1步定義的特性類,則例項化(propertyinfo.getcustomattribute
)特性類,呼叫第1步定義的方法:m
運用:在實體類定義裡,在屬性上面加特性類的名稱:(displayattribute
),其中attribute可以省略;
運用:在主函式裡,反射遍歷乙個實體的屬性,呼叫屬性的靜態方法返回屬性的自定義名稱,沒有自定義名稱就返回屬性名稱;
其他如驗證屬性值長度、必填等等的特性,區別在於:定義擴充套件方法時,第2個引數為類實體,也就是說要傳入實體,如這樣:public static bool lenghtrange(this propertyinfo propertyinfo, student student)
,多個student
引數;
還可以給類、方法定義特性,通過反射不同的元資料(類或者方法methodinfo
)即可;
public
class
zdisplaynameattribute
:attribute
public
string
getdisplayname()
}
///
/// 反射類,遍歷類所有屬性(propertyinfo),如果有指定特性,則呼叫此方法,就能返回自定義屬性名稱
///
///
///
public
static
string
getcusdisplayname
(this
propertyinfo propertyinfo)
return _displayname;
}
public
class
student
//相當於呼叫zdisplaynameattribute的建構函式
[zdisplayname
("學生名稱")]
public
string name
//呼叫zlenghtrangeattribute的建構函式
[zlenghtrange(10
,20)]
public
string password
}
public
static
void
printinstance
(student student)
:\t\t驗證結果:");
}}
理解自定義特性 Attribute
假設 外語老師 是乙個類,那麼 外語老師 應該具有這樣的特性 會說外語 並且 會說外語 這一特性又包含一些資訊,比如 外語種類 外語水平 其它資訊。按照這樣的理解,應該有下面的實現。using system using system.reflection namespace test console...
C 使用自定義的特性Attribute
c 程式設計經常使用特性,相當於類的元資料 自定義特性繼承system.attribute類 自定特性命名字尾為attribute,這樣符合微軟的命名風格,也符合編譯器的搜尋規則 使用語法使用自定義特性 可以使用反射來檢視自定義特性 attributeusage attributetargets.c...
C 自定義特性
code1 using system using system.collections.generic using system.linq using system.text namespace mylibrary.attributeclass 對於位置引數,通常只提供get訪問器 public s...