泛型
1.枚举获取特性,转换值
using System; using System.Reflection; namespace MyAttribute { public static class HelloExtesion { public static string GetStr(this Enum e) { Type type = typeof(UserState); FieldInfo p = type.GetField(e.ToString()); if (p.IsDefined(typeof(CSAttribute), true)) { CSAttribute cs = p.GetCustomAttribute(typeof(CSAttribute)) as CSAttribute; return cs.Name; } else { return e.ToString(); } } } public enum UserState { [CS("富人")] Rich = 1, [CS("一般人")] Normal = 2, //[CS("穷人")] Poor = 3, } public class CSAttribute : Attribute { public string Name { set; get; } public CSAttribute(string Name) { this.Name = Name; } } }
2.特性验证字段格式
using System; using System.Reflection; namespace MyAttribute { public static class DataValidate { public static void Validate<T>(this T t) { Type type = typeof(T); foreach (var item in type.GetProperties()) { if (item.IsDefined(typeof(AgeAttribute), true)) { AgeAttribute ageAttribute = item.GetCustomAttribute(typeof(AgeAttribute)) as AgeAttribute; if (!ageAttribute.Validate(item.GetValue(t))) { throw new Exception("年龄格式不正确"); } } if (item.IsDefined(typeof(QQAttribute), true)) { QQAttribute qqAttribute = item.GetCustomAttribute(typeof(QQAttribute)) as QQAttribute; if (!qqAttribute.Validate(item.GetValue(t))) { throw new Exception("QQ格式不正确"); } } } } } public class Yun { public int Id { set; get; } [AgeAttribute(0, 100)] public int Age { set; get; } [QQAttribute(10001, 9999999999)] public long QQ { set; get; } public string Email { set; get; } } public class QQAttribute : Attribute { public long _min { set; get; } public long _max { set; get; } public QQAttribute(long min, long max) { this._min = min; this._max = max; } public bool Validate(object obj) { if (obj != null) { if (long.TryParse(obj.ToString(), out long _Result)) { return _Result >= _min && _Result <= _max; } } return false; } } public class AgeAttribute : Attribute { public int _min { set; get; } public int _max { set; get; } public AgeAttribute(int min, int max) { this._min = min; this._max = max; } public bool Validate(object obj) { if (obj != null) { if (Int32.TryParse(obj.ToString(), out int _Result)) { return _Result >= _min && _Result <= _max; } } return false; } } }