通過特性提供額外行為的例項:自定義特性做資料驗證(效驗屬性值的大小和非空)
學生類中有個qq的屬性,效驗qq不能小於100000(5位數),不能大於999999999999(12位數),並且qq的屬性不能為空。如果滿足這些效驗返回true,否則返回false。
宣告乙個抽象類,所有的自定義特性都繼承自這個抽象類,為了確保自定義特性都實現資料效驗的方法。
宣告效驗屬性非空的特性:/// /// 抽象類 基類
///
public abstract class abstractvailddataattribute : attribute
宣告效驗屬性值大小的特性:/// /// 宣告乙個可以對屬性應用 空字串效驗的特性
/// 效驗值是否為空
///
[attributeusage(attributetargets.property)]
public class requireattribute : abstractvailddataattribute
}
宣告乙個學生類,並在屬性上面新增上自定義的兩個特性(『long』,『require』):/// /// 宣告乙個可以對屬性應用longattribute的特性
/// 效驗值的範圍
///
[attributeusage(attributetargets.property)]
public class longattribute : abstractvailddataattribute
public override bool validdata(object ovalue)
}
宣告乙個擴充套件方法,用於呼叫反射來效驗屬性的值:public class student
public string name
[long(10000, 999999999999)]
[require]
public long qq
}
呼叫擴充套件方法,驗證特性效果:/// /// 效驗屬性的值
///
///
///
///
public static bool validdataextend(this t t) }}
}return true;
}
執行結果:static void main(string args)
;if (student.validdataextend())
else
console.readkey();
}
整體實現思路:
1.宣告抽象類(基類)
2.宣告非空效驗特性和數值大小效驗特性
3.在屬性上面應用特性
4.使用反射訪問特性,效驗數值是否符合要求
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
c 特性 Attribute 學習總結1
特性是用於在執行時傳遞程式中各種元素 類 方法 結構 列舉 元件等 的行為資訊的宣告性標籤。官方的解讀不好理解,舉個常用的例子,平時會在類的上面加上 serializable serializable就是testclass這個類的乙個特性,它表示這個類是可以被序列化的。如下圖 net框架提供兩種型別...