利用反射,设置获取自定义特性
1、建立类库及实体类UseInfo.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Entities.Attributes; 7 8 namespace Entities 9 { 10 public class UserInfo:BaseModel 11 { 12 [Column(mapName:"UserName")] 13 public string Name { get; set; } 14 [Column(minLength: 6, maxLength: 12, errorMess:"no pass",regx:"")] 15 public string Pass { get; set; } 16 [Format("yyyy-MM-dd")] 17 public DateTime AddDateTime { get; set; } 18 public bool Enable { get; set; } 19 20 [Format("F2")] 21 public decimal Total { get; set; } 22 23 [Column(minLength:0,maxLength:1)] 24 public int Status { get; set; } 25 } 26 }
2、建立特性类
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Linq; 5 using System.Reflection; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace Entities.Attributes 10 { 11 12 [AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] 13 public class ColumnAttribute:Attribute 14 { 15 public int? MinLength { get; private set; } 16 17 public int? MaxLength { get; private set; } 18 19 public string ErrorMess { get; private set; } 20 21 public string MapName { get; private set; } 22 23 public string Regx { get; private set; } 24 25 public ColumnAttribute(string mapName, int minLength=0, int maxLength=0, string errorMess=null, string regx=null) 26 { 27 MinLength = minLength; 28 MaxLength = maxLength; 29 MapName = mapName; 30 ErrorMess = errorMess; 31 Regx = regx; 32 } 33 34 public ColumnAttribute(string mapName) 35 { 36 MapName = mapName; 37 } 38 39 public ColumnAttribute(string mapName, int minLength = 0) 40 { 41 MinLength = minLength; 42 MapName = mapName; 43 } 44 45 public ColumnAttribute(string mapName, int minLength = 0, int maxLength = 0) 46 { 47 MinLength = minLength; 48 MaxLength = maxLength; 49 MapName = mapName; 50 } 51 52 public ColumnAttribute(string mapName, int minLength = 0, int maxLength = 0, string errorMess = null) 53 { 54 MinLength = minLength; 55 MaxLength = maxLength; 56 MapName = mapName; 57 ErrorMess = errorMess; 58 } 59 60 public ColumnAttribute( int minLength = 0, int maxLength = 0, string errorMess = null, string regx = null) 61 { 62 MinLength = minLength; 63 MaxLength = maxLength; 64 ErrorMess = errorMess; 65 Regx = regx; 66 } 67 } 68 69 public static class ColumnEx 70 { 71 public static string GetName(this PropertyInfo property) 72 { 73 if (property.IsDefined(typeof(ColumnAttribute), true)) 74 { 75 var attr = Attribute.GetCustomAttribute(property, typeof(ColumnAttribute), false); 76 return (attr as ColumnAttribute).MapName??property.Name; 77 } 78 else 79 { 80 return property.Name; 81 } 82 } 83 84 //public override string ToString() 85 //{ 86 // if (this.GetType().IsDefined(typeof(ColumnAttribute), false)) 87 // { 88 // Attribute attr = Attribute.GetCustomAttribute(this.GetType(), typeof(ColumnAttribute), false); 89 // if (attr != null) 90 // { 91 // return string.Format("{0} likes to eat {1}.", ((ColumnAttribute)attr).MapName, 92 // ((ColumnAttribute)attr).MapName); 93 // } 94 // } 95 // return base.ToString(); 96 //} 97 98 public static bool IsVerify<T>(T model) where T : class 99 { 100 var type = model.GetType(); 101 var properties = type.GetProperties(); 102 103 foreach (var propertyInfo in properties) 104 { 105 var val = propertyInfo.GetValue(model,null); 106 var Strval = val?.ToString(); 107 var attr = Attribute.GetCustomAttribute(propertyInfo, typeof(ColumnAttribute), false) as ColumnAttribute; 108 if (attr != null) 109 { 110 if (attr.MinLength > 0) 111 { 112 #region MinLength 113 114 if (!string.IsNullOrWhiteSpace(Strval) && Strval.Length >= attr.MinLength) 115 { 116 Debug.WriteLine( 117 $"Info:{type.Name}--{propertyInfo.Name}--Value MinLength {attr.MinLength}√"); 118 } 119 else 120 { 121 Debug.WriteLine( 122 $"Error:{type.Name}--{propertyInfo.Name}--Value MinLength {attr.MinLength}"); 123 return false; 124 } 125 126 #endregion 127 } 128 129 if (attr.MaxLength > 0) 130 { 131 #region MaxLength 132 if (!string.IsNullOrWhiteSpace(Strval) && Strval.Length <= attr.MaxLength) 133 { 134 Debug.WriteLine( 135 $"Info:{type.Name}--{propertyInfo.Name}--Value MaxLength {attr.MaxLength}√"); 136 } 137 else 138 { 139 Debug.WriteLine( 140 $"Error:{type.Name}--{propertyInfo.Name}--Value MaxLength {attr.MaxLength}"); 141 return false; 142 } 143 #endregion 144 } 145 } 146 } 147 148 return false; 149 } 150 } 151 152 153 }
AttributeUsage:修饰此特性使用范围
IsVerify:集成自定义数据验证
Format:特性与Column特性写法基本差不多,作用是格式化输出
自定义特性必须集成,Attribute类,类名称以“Attribute”结尾
3、调用测试
1 [TestMethod] 2 public void TestDataVerify() 3 { 4 var user=new UserInfo(); 5 user.Pass = "123156"; 6 user.Status = 3; 7 8 if (ColumnEx.IsVerify(user)) 9 { 10 11 } 12 } 13 14 [TestMethod] 15 public void TestFormatOut() 16 { 17 var user = new UserInfo(); 18 user.Pass = "123156"; 19 user.Status = 3; 20 user.Total = (decimal)3.556878; 21 user.AddDateTime=DateTime.Now; 22 var plist = user.GetType().GetProperties(); 23 foreach (var item in plist) 24 { 25 Console.WriteLine(item.GetName()); 26 Debug.WriteLine(item.FormatOutput(item.GetValue(user,null))); 27 } 28 }