C#特性[Attribute]是一類特殊的語法結(jié)構(gòu),我們掌握了特性的相關(guān)用法执虹,就能在運(yùn)行時拓挥,通過反射,得到一些額外的屬性袋励,給后續(xù)程序邏輯進(jìn)行使用和判斷侥啤。
我們在日常的代碼中,通常都是通過反射來獲得相關(guān)特性對象茬故,再賦值給相關(guān)對象盖灸,進(jìn)行獲取判斷。
我們接下來看看磺芭,我們?nèi)粘9ぷ髦械奶匦缘氖褂谩?/p>
構(gòu)建自定義特性類
我們該怎么構(gòu)建自己的特性呢赁炎?
.NET FRAMEWORK 類庫框架中所有特性類都是派生于Attribute這個基類。
所以我們自定義的特性類代碼將類似于下面的內(nèi)容:
[AttributeUsage(AttributeTargets.Class| AttributeTargets.Property)]
public class MyAttribute:Attribute
{
///相關(guān)屬性 字段
public MyAttribute(){
//構(gòu)造方法
}
}
這么寫完钾腺,我們就能用這個特性了徙垫。
一些名詞的解釋:
[AttributeUsage()] 表示本特性類作用的范圍讥裤。編譯的時候直接調(diào)用該構(gòu)造方法
參數(shù):需要傳遞枚舉Enum類型值,上面代碼中表示本特性只能作用于類級別或者是屬性級別
這里有個知識點:原來方法中傳入enum類型的值可以用' | '來表示傳入多個姻报。
ok己英,我們構(gòu)建了自己的特性類,我們該怎么用吴旋?
自定義特性上戰(zhàn)場之:寄生
目前為止剧辐,我們已經(jīng)構(gòu)建了自己的特性:MyAttribute類,接下來我們讓他像寄生蟲一樣寄生到別的類上面邮府。
直接上一個Model類:
///本類是模型類荧关,表示所有人,或者數(shù)據(jù)庫里面有一張people這樣的數(shù)據(jù)表
[My()]
public class people{
private string personname;
[My()]
public string Personname{
get{ return this.personname;}
set{this.personname=value;}
}
}
ok,成功讓MyAttribute寄生到people類中褂傀∪唐。可能大家會對其中的代碼存在一些疑問,我們一一進(jìn)行講解:
[My()]是什么仙辟? My是MyAttribute的縮寫同波,比如YourAttribute在使用的時候,就可以縮寫為:[Your()]
My()告訴編譯器叠国,這里是特性類未檩,你需要實例化這個特性類,如果特性類構(gòu)造方法有參數(shù)的粟焊,可以傳參冤狡。
注意點:自定義特性類的時候,不能是靜態(tài)的類型项棠,也就是static不能用來修飾類名悲雳,否則編譯的時候怎么實例化呢?
構(gòu)建好了香追,寄生也完成了合瓢,那么我們怎么用啊透典? 下面就要寄出一個高端貨了晴楔。
自定義特性上戰(zhàn)場之:獲取
目前為止,我們完成了兩個步驟:構(gòu)建特性類峭咒、寄生特性類税弃。
完整的步驟就剩一下一步:獲取特性類記錄的數(shù)據(jù)。
完成了這個讹语,革命就成功了钙皮。
代碼駕到:
public static class DoAttr{
public static string CheckAttr(people p){
if(p!=null){
Type type=p.GetType();
PropertyInfo propertyMy=type.GetProperty("Personname");//反射獲取該屬性
//接下來獲得我們的特性
var myattr=(MyAttribute)propertyMy.GetCustomAttribute(typeof(MyAttribute),false);
string personnme=myattr.Personname;
return personname;
}else{
return null;
}
}
}
ok了,我們通過該方法獲取了people類的一些額外的數(shù)據(jù)信息,這個數(shù)據(jù)信息獲得之后短条,隨便我們怎么弄了导匣,展示在網(wǎng)頁上,存儲到數(shù)據(jù)庫都可以了茸时。
這里有一個注意點:
當(dāng)我們通過反射獲取特性的時候贡定,命名空間請寫上,寫全可都。
我們總結(jié)一下:特性是類級別的缓待,也意思就是寄生了特性的類,所有實例化的對象都具備了相同的特性信息渠牲,所以旋炒,特性是類級別上的額外屬性。
很多人問:學(xué)C#什么用签杈?工作機(jī)會少得可憐瘫镇。別的我就不說了,學(xué)C#你就可以結(jié)合Unity做AR按鹄选铣除!微軟的全息眼鏡,科技感十足啊鹦付。
VS2017出來啦尚粘,號稱這個星球上最屌的IDE,據(jù)說體驗很好敲长,趕緊下起來郎嫁。
如果想要源代碼,請留言哦潘明。