特性:是一個類,用來標記元素,編譯時生成到metadata裏面,平時不影響程序的運行,除非主動用反射區查找,能夠獲得一些額外的信息/操做,提供了更豐富的擴展空間。ide
示例代碼以下:this
class Program { static void Main(string[] args) { ///獲取枚舉描述 { string userState = UserState.Frozen.GetRemark(); Console.WriteLine(userState); } //校驗數據 { Student student = new Student() { Score = 90 }; bool b = DataVaildate.Validate<Student>(student); student.Score = -1; b = DataVaildate.Validate<Student>(student); } Console.ReadKey(); } } /// <summary> /// 擴展方法 /// 一、靜態類 /// 二、靜態方法 /// 三、第一個參數類型前加this /// </summary> public static class EnumExtend { public static string GetRemark(this Enum enumValue) { Type type = enumValue.GetType(); FieldInfo fieldInfo = type.GetField(enumValue.ToString()); if (fieldInfo.IsDefined(typeof(RemarkAttribute), true)) { RemarkAttribute remarkAttribute = (RemarkAttribute)fieldInfo.GetCustomAttribute(typeof(RemarkAttribute), true); return remarkAttribute.Remark; } else { return enumValue.ToString(); } } } [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]//修飾特性的特性 public class RemarkAttribute : Attribute//Remark特性 { public string Remark { get; private set; } public RemarkAttribute(string remark) { this.Remark = remark; } } /// <summary> /// 校驗特性的父類 /// </summary> public abstract class AbstractValidateAttribute : Attribute { public abstract bool Validate(object oValue); } /// <summary> /// Long取值範圍校驗特性 /// </summary> public class LongValidateAttribute : AbstractValidateAttribute { private long _lMin = 0;//最小值 private long _lMax = 0;//最大值 public LongValidateAttribute(long lMin, long lMax) { this._lMin = lMin; this._lMax = lMax; } public override bool Validate(object oValue) { return this._lMin <= (long)oValue && (long)oValue <= this._lMax; } } public enum UserState { [Remark("正常")] Normal = 0, [Remark("凍結")] Frozen = 1, [Remark("刪除")] Deleted = 2 } public class Student { [LongValidate(0, 100)] public long Score { get; set; } } public class DataVaildate { public static bool Validate<T>(T t) { Type type = t.GetType();//獲取傳入參數的類型 foreach (var prop in type.GetProperties())//遍歷屬性 { if (prop.IsDefined(typeof(AbstractValidateAttribute), true))//判斷屬性是否認義了校驗的特性 { AbstractValidateAttribute abstractValidateAttribute = (AbstractValidateAttribute)prop.GetCustomAttribute(typeof(AbstractValidateAttribute), true);//獲取到須要校驗的特性 if (!abstractValidateAttribute.Validate(prop.GetValue(t)))//校驗 { return false; } } } return true; } }