c#特性(Attribute)學習總結2
阿新 • • 發佈:2021-01-20
通過特性提供額外行為的例項:自定義特性做資料驗證(效驗屬性值的大小和非空)
學生類中有個QQ的屬性,效驗QQ不能小於100000(5位數),不能大於999999999999(12位數),並且QQ的屬性不能為空。如果滿足這些效驗返回true,否則返回false。
宣告一個抽象類,所有的自定義特性都繼承自這個抽象類,為了確保自定義特性都實現資料效驗的方法。
/// <summary> /// 抽象類 基類 /// </summary> public abstract class AbstractVaildDataAttribute : Attribute { /// <summary> /// 驗證資料是否符合要求 /// </summary> /// <param name="oValue"></param> /// <returns></returns> public abstract bool ValidData(object oValue); }
宣告效驗屬性非空的特性:
/// <summary> /// 宣告一個可以對屬性應用 空字串效驗的特性 /// 效驗值是否為空 /// </summary> [AttributeUsage(AttributeTargets.Property)] public class RequireAttribute : AbstractVaildDataAttribute { public override bool ValidData(object oValue) { return !string.IsNullOrEmpty(oValue.ToString()); } }
宣告效驗屬性值大小的特性:
/// <summary> /// 宣告一個可以對屬性應用LongAttribute的特性 /// 效驗值的範圍 /// </summary> [AttributeUsage(AttributeTargets.Property)] public class LongAttribute : AbstractVaildDataAttribute { private long _Min = 0; private long _Max = 0; public LongAttribute(long min, long max) { _Min = min; _Max = max; } public override bool ValidData(object oValue) { long lValue = 0; return oValue != null && long.TryParse(oValue.ToString(), out lValue) && lValue >= _Min && lValue <= _Max; } }
宣告一個學生類,並在屬性上面新增上自定義的兩個特性(‘Long’,‘Require’):
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[Long(10000, 999999999999)]
[Require]
public long QQ { get; set; }
}
宣告一個擴充套件方法,用於呼叫反射來效驗屬性的值:
/// <summary>
/// 效驗屬性的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static bool ValidDataExtend<T>(this T t) {
Type type = t.GetType();
foreach (var prop in type.GetProperties())
{
if (prop.IsDefined(typeof(AbstractVaildDataAttribute),true))
{
object oValue = prop.GetValue(t);//獲取要校驗型別的值
object[] oAttributeArr = prop.GetCustomAttributes(typeof(AbstractVaildDataAttribute), true);//獲取所有自定義的特性
foreach (AbstractVaildDataAttribute attr in oAttributeArr)
{
if (!attr.ValidData(oValue))
{
return false;
}
}
}
}
return true;
}
呼叫擴充套件方法,驗證特性效果:
static void Main(string[] args)
{
Student student = new Student()
{
Id = 1,
Name = "張三",
QQ = 1234565555
};
if (student.ValidDataExtend())
{
Console.WriteLine("效驗通過");
}
else
{
Console.WriteLine("效驗不通過");
}
Console.ReadKey();
}
執行結果:
整體實現思路:
1.宣告抽象類(基類)
2.宣告非空效驗特性和數值大小效驗特性
3.在屬性上面應用特性
4.使用反射訪問特性,效驗數值是否符合要求