.NET身份证验证
身份证号码编码规则及校验位校验算法
算法地址:http://jingyan.baidu.com/article/7f41ececff944a593d095c8c.html
简单验证长度
1 /// <summary> 2 /// 检查身份证基本信息 3 /// </summary> 4 /// <returns>结果</returns> 5 private string CheckAndParse() 6 { 7 if (string.IsNullOrWhiteSpace(this.Id)) 8 { 9 return "身份证号码不能为空"; 10 } 11 if (this.Id.Length == 15) 12 { 13 return this.ParseCardInfo15(); 14 } 15 if (this.Id.Length == 18) 16 { 17 return this.ParseCardInfo18(); 18 } 19 return "身份证号码必须为15位或18位"; 20 }
身份证分为2中 18位 OR 15位
验证先用正则表达式进行初步验证 并且取出 身份证上面包含的信息(地区 生日 随机码 性别 尾号)
18位身份证
/// <summary> /// 18位身份证 /// </summary> /// <returns>结果</returns> private string ParseCardInfo18() { const string CardIdParttern = @"(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d{1})([\d,x,X]{1})"; Match match = Regex.Match(this.Id, CardIdParttern); if (match.Success) { this.areaCode = match.Groups[1].Value; string year = match.Groups[2].Value; string month = match.Groups[3].Value; string day = match.Groups[4].Value; this.birthCode = year + month + day; this.randomCode = match.Groups[5].Value; this.sexCode = char.Parse(match.Groups[6].Value); string verifyCode = match.Groups[7].Value.ToUpper(); if (this.ValidateVerifyCode(this.Id.Substring(0, 17), char.Parse(verifyCode))) { try { this.Birth = BirthDate.GetBirthDate(year, month, day); this.Area = AreaCodeMapping.GetArea(this.areaCode); Sex = GetSex(this.sexCode); } catch (System.Exception ex) { return ex.Message; } return string.Empty; } } return "身份证号码格式错误"; }
15位身份证
1 /// <summary> 2 /// 15位身份证 3 /// </summary> 4 /// <returns>结果</returns> 5 private string ParseCardInfo15() 6 { 7 const string CardIdParttern = @"(\d{6})(\d{2})(\d{2})(\d{2})(\d{2})(\d{1})"; 8 Match match = Regex.Match(this.Id, CardIdParttern); 9 if (match.Success) 10 { 11 this.areaCode = match.Groups[1].Value; 12 string year = match.Groups[2].Value; 13 string month = match.Groups[3].Value; 14 string day = match.Groups[4].Value; 15 this.birthCode = year + month + day; 16 this.randomCode = match.Groups[5].Value; 17 this.sexCode = char.Parse(match.Groups[6].Value); 18 19 try 20 { 21 this.Area = AreaCodeMapping.GetArea(this.areaCode); 22 this.Birth = BirthDate.GetBirthDate(year, month, day); 23 Sex = GetSex(this.sexCode); 24 } 25 catch (System.Exception ex) 26 { 27 return ex.Message; 28 } 29 return string.Empty; 30 } 31 return "身份证号码格式错误"; 32 }
校验代码
1 namespace Notify.Solution.Code.IdentityCard 2 { 3 /// <summary> 4 /// 验证类 5 /// </summary> 6 public class Validator 7 { 8 /// <summary> 9 /// 验证码 10 /// </summary> 11 private readonly char[] verifyCodeMapping = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; 12 13 /// <summary> 14 /// 地区代码 15 /// </summary> 16 private string areaCode; 17 18 /// <summary> 19 /// 生日 20 /// </summary> 21 private string birthCode; 22 23 /// <summary> 24 /// 随机 25 /// </summary> 26 private string randomCode; 27 28 /// <summary> 29 /// 性别 30 /// </summary> 31 private char sexCode; 32 33 /// <summary> 34 /// Initializes a new instance of the <see cref="Validator"/> class. 35 /// </summary> 36 /// <param name="id">Id</param> 37 public Validator(string id) 38 { 39 this.Id = id; 40 this.Success = false; 41 this.ErrorMessage = string.Empty; 42 this.Area = null; 43 this.Birth = BirthDate.Empty; 44 this.Sex = Sex.Male; 45 } 46 47 /// <summary> 48 /// 身份证ID 49 /// </summary> 50 public string Id { get; private set; } 51 52 /// <summary> 53 /// 结果 54 /// </summary> 55 public bool Success { get; private set; } 56 57 /// <summary> 58 /// 错误信息 59 /// </summary> 60 public string ErrorMessage { get; private set; } 61 62 /// <summary> 63 /// 区域信息 64 /// </summary> 65 public AreaInformation Area { get; private set; } 66 67 /// <summary> 68 /// 生日 69 /// </summary> 70 public BirthDate Birth { get; private set; } 71 72 /// <summary> 73 /// 性别 74 /// </summary> 75 public Sex Sex { get; private set; } 76 77 /// <summary> 78 /// 执行比较结果 79 /// </summary> 80 /// <returns>结果</returns> 81 public bool Execute() 82 { 83 string msg = this.CheckAndParse(); 84 if (string.IsNullOrWhiteSpace(msg)) 85 { 86 this.ErrorMessage = string.Empty; 87 this.Success = true; 88 } 89 else 90 { 91 this.ErrorMessage = msg; 92 this.Success = false; 93 } 94 return this.Success; 95 } 96 97 /// <summary> 98 /// IdentityCard18 99 /// </summary> 100 public string IdentityCard18 101 { 102 get 103 { 104 if (string.IsNullOrWhiteSpace(this.Id)) 105 { 106 return "身份证号码不能为空"; 107 } 108 if (this.Success && this.Id.Length == 15) 109 { 110 return this.ToCardInfo18(); 111 } 112 return this.Id; 113 } 114 } 115 116 /// <summary> 117 /// ToCardInfo18 118 /// </summary> 119 /// <returns>结果</returns> 120 private string ToCardInfo18() 121 { 122 string bodyCode = GetBodyCode(this.areaCode, "19" + this.birthCode, this.randomCode, this.sexCode); 123 char verifyCode = this.GetVerifyCode(bodyCode); 124 return bodyCode + verifyCode; 125 } 126 127 /// <summary> 128 /// 获取bodyCode 129 /// </summary> 130 /// <param name="areaCode">areaCode</param> 131 /// <param name="birthCode">birthCode</param> 132 /// <param name="randomCode">randomCode</param> 133 /// <param name="sexCode">sexCode</param> 134 /// <returns></returns> 135 private static string GetBodyCode(string areaCode, string birthCode, string randomCode, char sexCode) 136 { 137 return areaCode + birthCode + randomCode + sexCode.ToString(); 138 } 139 140 /// <summary> 141 /// 检查身份证基本信息 142 /// </summary> 143 /// <returns>结果</returns> 144 private string CheckAndParse() 145 { 146 if (string.IsNullOrWhiteSpace(this.Id)) 147 { 148 return "身份证号码不能为空"; 149 } 150 if (this.Id.Length == 15) 151 { 152 return this.ParseCardInfo15(); 153 } 154 if (this.Id.Length == 18) 155 { 156 return this.ParseCardInfo18(); 157 } 158 return "身份证号码必须为15位或18位"; 159 } 160 161 /// <summary> 162 /// 18位身份证 163 /// </summary> 164 /// <returns>结果</returns> 165 private string ParseCardInfo18() 166 { 167 const string CardIdParttern = @"(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d{1})([\d,x,X]{1})"; 168 Match match = Regex.Match(this.Id, CardIdParttern); 169 if (match.Success) 170 { 171 this.areaCode = match.Groups[1].Value; 172 string year = match.Groups[2].Value; 173 string month = match.Groups[3].Value; 174 string day = match.Groups[4].Value; 175 this.birthCode = year + month + day; 176 this.randomCode = match.Groups[5].Value; 177 this.sexCode = char.Parse(match.Groups[6].Value); 178 string verifyCode = match.Groups[7].Value.ToUpper(); 179 180 if (this.ValidateVerifyCode(this.Id.Substring(0, 17), char.Parse(verifyCode))) 181 { 182 try 183 { 184 this.Birth = BirthDate.GetBirthDate(year, month, day); 185 this.Area = AreaCodeMapping.GetArea(this.areaCode); 186 Sex = GetSex(this.sexCode); 187 } 188 catch (System.Exception ex) 189 { 190 return ex.Message; 191 } 192 return string.Empty; 193 } 194 } 195 return "身份证号码格式错误"; 196 } 197 198 /// <summary> 199 /// 验证验证码 200 /// </summary> 201 /// <param name="bodyCode">bodyCode</param> 202 /// <param name="verifyCode">verifyCode</param> 203 /// <returns>结果</returns> 204 private bool ValidateVerifyCode(string bodyCode, char verifyCode) 205 { 206 char calculatedVerifyCode = this.GetVerifyCode(bodyCode); 207 return calculatedVerifyCode == verifyCode; 208 } 209 210 /// <summary> 211 /// 15位身份证 212 /// </summary> 213 /// <returns>结果</returns> 214 private string ParseCardInfo15() 215 { 216 const string CardIdParttern = @"(\d{6})(\d{2})(\d{2})(\d{2})(\d{2})(\d{1})"; 217 Match match = Regex.Match(this.Id, CardIdParttern); 218 if (match.Success) 219 { 220 this.areaCode = match.Groups[1].Value; 221 string year = match.Groups[2].Value; 222 string month = match.Groups[3].Value; 223 string day = match.Groups[4].Value; 224 this.birthCode = year + month + day; 225 this.randomCode = match.Groups[5].Value; 226 this.sexCode = char.Parse(match.Groups[6].Value); 227 228 try 229 { 230 this.Area = AreaCodeMapping.GetArea(this.areaCode); 231 this.Birth = BirthDate.GetBirthDate(year, month, day); 232 Sex = GetSex(this.sexCode); 233 } 234 catch (System.Exception ex) 235 { 236 return ex.Message; 237 } 238 return string.Empty; 239 } 240 return "身份证号码格式错误"; 241 } 242 243 /// <summary> 244 /// 获取验证码 245 /// </summary> 246 /// <param name="bodyCode">bodyCode</param> 247 /// <returns>结果</returns> 248 private char GetVerifyCode(string bodyCode) 249 { 250 char[] bodyCodeArray = bodyCode.ToCharArray(); 251 ////int sum = 0; 252 ////for (int index = 0; index < bodyCodeArray.Length; index++) 253 ////{ 254 //// sum += int.Parse(bodyCodeArray[index].ToString()) * GetWeight(index); 255 ////} 256 ////return this.verifyCodeMapping[sum % 11]; 257 int sum = bodyCodeArray.Select((t, index) => int.Parse(t.ToString()) * GetWeight(index)).Sum(); 258 return this.verifyCodeMapping[sum % 11]; 259 } 260 261 /// <summary> 262 /// GetWeight 263 /// </summary> 264 /// <param name="index">index</param> 265 /// <returns>index</returns> 266 private static int GetWeight(int index) 267 { 268 return (1 << (17 - index)) % 11; 269 } 270 271 /// <summary> 272 /// 获取性别 273 /// </summary> 274 /// <param name="sexCode">性别代码</param> 275 /// <returns>性别</returns> 276 private static Sex GetSex(char sexCode) 277 { 278 return ((int)sexCode) % 2 == 0 ? Sex.Female : Sex.Male; 279 } 280 } 281 282 /// <summary> 283 /// 生日 284 /// </summary> 285 public struct BirthDate 286 { 287 /// <summary> 288 /// 年 289 /// </summary> 290 private readonly string year; 291 292 /// <summary> 293 /// 月 294 /// </summary> 295 private readonly string month; 296 297 /// <summary> 298 /// 日 299 /// </summary> 300 private readonly string day; 301 302 /// <summary> 303 /// 默认 304 /// </summary> 305 public static BirthDate Empty 306 { 307 get { return new BirthDate("00", "00", "00"); } 308 } 309 310 /// <summary> 311 /// Initializes a new instance of the <see cref="BirthDate"/> struct. 312 /// </summary> 313 /// <param name="year">年</param> 314 /// <param name="month">月</param> 315 /// <param name="day">日</param> 316 public BirthDate(string year, string month, string day) 317 { 318 this.year = year; 319 this.month = month; 320 this.day = day; 321 } 322 323 /// <summary> 324 /// 获取生日 325 /// </summary> 326 /// <param name="year">年</param> 327 /// <param name="month">月</param> 328 /// <param name="day">日</param> 329 /// <returns>结果</returns> 330 public static BirthDate GetBirthDate(string year, string month, string day) 331 { 332 DateTime date; 333 if (DateTime.TryParse(string.Format("{0}-{1}-{2}", year, month, day), out date)) 334 { 335 return new BirthDate(year, month, day); 336 } 337 throw new System.Exception("日期不存在"); 338 } 339 340 /// <summary> 341 /// 年 342 /// </summary> 343 public string Year 344 { 345 get { return this.year; } 346 } 347 348 /// <summary> 349 /// 年 350 /// </summary> 351 public string Month 352 { 353 get { return this.month; } 354 } 355 356 /// <summary> 357 /// 日 358 /// </summary> 359 public string Day 360 { 361 get { return this.day; } 362 } 363 364 /// <summary> 365 /// 重写ToString 366 /// </summary> 367 /// <returns>结果</returns> 368 public override string ToString() 369 { 370 return string.Format("{0}年{1}月{2}日", this.year, this.month, this.day); 371 } 372 373 /// <summary> 374 /// 重写ToString 375 /// </summary> 376 /// <param name="separator">separator</param> 377 /// <returns>结果</returns> 378 public string ToString(string separator) 379 { 380 return string.Format("{1}{0}{2}{0}{3}", separator, this.year, this.month, this.day); 381 } 382 } 383 384 /// <summary> 385 /// 性别 386 /// </summary> 387 public enum Sex 388 { 389 /// <summary> 390 /// 男 391 /// </summary> 392 Male, 393 394 /// <summary> 395 /// 女 396 /// </summary> 397 Female 398 } 399 }
读取地区代码
1 namespace Notify.Solution.Code.IdentityCard 2 { 3 /// <summary> 4 /// 区域配置 5 /// </summary> 6 public class AreaCodeMapping 7 { 8 /// <summary> 9 /// 区域字典 10 /// </summary> 11 private static readonly Dictionary<string, Area> areas; 12 13 /// <summary> 14 /// Initializes static members of the <see cref="AreaCodeMapping"/> class. 15 /// </summary> 16 static AreaCodeMapping() 17 { 18 areas = LoadAreaInfo(); 19 } 20 21 /// <summary> 22 /// 加载信息 23 /// </summary> 24 /// <returns>区域信息</returns> 25 private static Dictionary<string, Area> LoadAreaInfo() 26 { 27 XmlDocument doc = LoadXmlDocument("AreaCodes.xml"); 28 XmlNode areasNode = doc.SelectSingleNode("AreaCode"); 29 if (areasNode != null) 30 { 31 XmlNodeList provinceNodeList = areasNode.ChildNodes; 32 return LoadProvinces(provinceNodeList); 33 } 34 35 return null; 36 } 37 38 /// <summary> 39 /// 加载XML 40 /// </summary> 41 /// <param name="fileName">文件名</param> 42 /// <returns>XmlDocument</returns> 43 private static XmlDocument LoadXmlDocument(string fileName) 44 { 45 var declaringType = MethodBase.GetCurrentMethod().DeclaringType; 46 if (declaringType != null) 47 { 48 string resourceName = declaringType.Namespace + "." + fileName; 49 Assembly assembly = Assembly.GetExecutingAssembly(); 50 Stream stream = assembly.GetManifestResourceStream(resourceName); 51 XmlDocument result = new XmlDocument(); 52 if (stream != null) 53 { 54 result.Load(stream); 55 } 56 return result; 57 } 58 return null; 59 } 60 61 /// <summary> 62 /// 解析XML节点 63 /// </summary> 64 /// <param name="provinceNodeList">provinceNodeList</param> 65 /// <returns>结果</returns> 66 private static Dictionary<string, Area> LoadProvinces(XmlNodeList provinceNodeList) 67 { 68 Dictionary<string, Area> result = new Dictionary<string, Area>(); 69 foreach (XmlNode provinceNode in provinceNodeList) 70 { 71 string code = GetAttribute(provinceNode, "code"); 72 string name = GetAttribute(provinceNode, "name"); 73 Area province = new Area(code, name, null); 74 var cities = LoadCities(province, provinceNode.ChildNodes); 75 foreach (var city in cities) 76 { 77 province.AppendChild(city); 78 } 79 result.Add(code, province); 80 } 81 return result; 82 } 83 84 /// <summary> 85 /// 加载城市 86 /// </summary> 87 /// <param name="province">省</param> 88 /// <param name="cityNodeList">节点</param> 89 /// <returns>结果</returns> 90 private static IEnumerable<Area> LoadCities(Area province, XmlNodeList cityNodeList) 91 { 92 List<Area> result = new List<Area>(); 93 if (cityNodeList != null) 94 { 95 foreach (XmlNode cityNode in cityNodeList) 96 { 97 string code = GetAttribute(cityNode, "code"); 98 string name = GetAttribute(cityNode, "name"); 99 Area city = new Area(code, name, province); 100 var counties = loadCounties(city, cityNode.ChildNodes); 101 foreach (var county in counties) 102 { 103 city.AppendChild(county); 104 } 105 result.Add(city); 106 } 107 } 108 return result; 109 } 110 111 /// <summary> 112 /// 加载区域 113 /// </summary> 114 /// <param name="city">市</param> 115 /// <param name="countyNodeList">节点</param> 116 /// <returns>结果</returns> 117 private static IEnumerable<Area> loadCounties(Area city, XmlNodeList countyNodeList) 118 { 119 List<Area> result = new List<Area>(); 120 if (countyNodeList != null) 121 { 122 foreach (XmlNode countyNode in countyNodeList) 123 { 124 string code = GetAttribute(countyNode, "code"); 125 string name = GetAttribute(countyNode, "name"); 126 Area county = new Area(code, name, city); 127 result.Add(county); 128 } 129 } 130 return result; 131 } 132 133 /// <summary> 134 /// 获取节点属性 135 /// </summary> 136 /// <param name="node">node</param> 137 /// <param name="attributeName">attributeName</param> 138 /// <returns>结果</returns> 139 private static string GetAttribute(XmlNode node, string attributeName) 140 { 141 if (node.Attributes != null) 142 { 143 XmlAttribute attribute = node.Attributes[attributeName]; 144 return attribute == null ? string.Empty : attribute.Value; 145 } 146 return string.Empty; 147 } 148 149 /// <summary> 150 /// 获取区域信息 151 /// </summary> 152 /// <param name="areaCode">区域代码</param> 153 /// <returns>结果</returns> 154 public static AreaInformation GetArea(string areaCode) 155 { 156 Area targetArea = null; 157 if (!string.IsNullOrWhiteSpace(areaCode) && areaCode.Length == 6) 158 { 159 string provinceCode = areaCode.Substring(0, 2); 160 if (areas.ContainsKey(provinceCode)) 161 { 162 var province = areas[provinceCode]; 163 string cityCode = areaCode.Substring(2, 2); 164 if (province.ContainsChild(cityCode)) 165 { 166 var city = province.GetChild(cityCode); 167 string countyCode = areaCode.Substring(4); 168 if (city.ContainsChild(countyCode)) 169 { 170 targetArea = city.GetChild(countyCode); 171 } 172 else 173 { 174 targetArea = city; 175 } 176 } 177 else if (province.ContainsChild(areaCode.Substring(2))) 178 { 179 targetArea = province.GetChild(areaCode.Substring(2)); 180 } 181 else 182 { 183 targetArea = province; 184 } 185 } 186 } 187 return targetArea == null ? null : targetArea.ToAreaInformation(); 188 } 189 } 190 191 /// <summary> 192 /// 区域 193 /// </summary> 194 public class Area 195 { 196 /// <summary> 197 /// 子区域 198 /// </summary> 199 private readonly Dictionary<string, Area> childrenDic; 200 201 /// <summary> 202 /// 区域集 203 /// </summary> 204 private readonly List<Area> childrenList; 205 206 /// <summary> 207 /// Initializes a new instance of the <see cref="Area"/> class. 208 /// </summary> 209 /// <param name="code">代码</param> 210 /// <param name="name">名称</param> 211 /// <param name="parent">父区域</param> 212 internal Area(string code, string name, Area parent) 213 { 214 this.Info = new CodeNameMapping(code, name); 215 this.Parent = parent; 216 this.childrenDic = new Dictionary<string, Area>(); 217 this.childrenList = new List<Area>(); 218 } 219 220 /// <summary> 221 /// 代码名称映射信息 222 /// </summary> 223 public CodeNameMapping Info 224 { 225 get; 226 private set; 227 } 228 229 /// <summary> 230 /// 父区域 231 /// </summary> 232 public Area Parent 233 { 234 get; 235 private set; 236 } 237 238 /// <summary> 239 /// 子区域 240 /// </summary> 241 public ReadOnlyCollection<Area> Children 242 { 243 get 244 { 245 return this.childrenList.AsReadOnly(); 246 } 247 } 248 249 /// <summary> 250 /// 区域集是否包含 251 /// </summary> 252 /// <param name="code">代码</param> 253 /// <returns>结果</returns> 254 internal bool ContainsChild(string code) 255 { 256 return this.childrenDic.ContainsKey(code); 257 } 258 259 /// <summary> 260 /// 获取区域 261 /// </summary> 262 /// <param name="code">代码</param> 263 /// <returns>区域</returns> 264 internal Area GetChild(string code) 265 { 266 return this.childrenDic[code]; 267 } 268 269 /// <summary> 270 /// 父亲区域 271 /// </summary> 272 internal Area TopParent 273 { 274 get 275 { 276 return this.Parent == null ? this : this.Parent.TopParent; 277 } 278 } 279 280 /// <summary> 281 /// 添加子区域 282 /// </summary> 283 /// <param name="child">子节点</param> 284 internal void AppendChild(Area child) 285 { 286 if (!this.childrenDic.ContainsKey(child.Info.Code)) 287 { 288 this.childrenDic.Add(child.Info.Code, child); 289 this.childrenList.Add(child); 290 } 291 } 292 293 /// <summary> 294 /// 区域信息转化 295 /// </summary> 296 /// <returns>区域信息</returns> 297 internal AreaInformation ToAreaInformation() 298 { 299 CodeNameMapping province = this.TopParent.Info; 300 CodeNameMapping city = default(CodeNameMapping); 301 CodeNameMapping county = default(CodeNameMapping); 302 if (this.Parent != null) 303 { 304 if (this.Parent.Info == province) 305 { 306 city = this.Info; 307 } 308 else 309 { 310 city = this.Parent.Info; 311 county = this.Info; 312 } 313 } 314 return new AreaInformation(province, city, county); 315 } 316 } 317 318 /// <summary> 319 /// 区域信息 320 /// </summary> 321 public class AreaInformation 322 { 323 /// <summary> 324 /// Initializes a new instance of the <see cref="AreaInformation"/> class. 325 /// </summary> 326 /// <param name="province">省</param> 327 /// <param name="city">市</param> 328 /// <param name="county">区</param> 329 public AreaInformation(CodeNameMapping province, CodeNameMapping city, CodeNameMapping county) 330 { 331 this.Province = province; 332 this.City = city; 333 this.County = county; 334 } 335 336 /// <summary> 337 /// 代码 338 /// </summary> 339 public string Code 340 { 341 get 342 { 343 return this.Province.Code + this.City.Code + this.County.Code; 344 } 345 } 346 347 /// <summary> 348 /// 省 349 /// </summary> 350 public CodeNameMapping Province 351 { 352 get; 353 private set; 354 } 355 356 /// <summary> 357 /// 市 358 /// </summary> 359 public CodeNameMapping City 360 { 361 get; 362 private set; 363 } 364 365 /// <summary> 366 /// 区 367 /// </summary> 368 public CodeNameMapping County 369 { 370 get; 371 private set; 372 } 373 374 /// <summary> 375 /// 名称 376 /// </summary> 377 public string FullName 378 { 379 get 380 { 381 return this.Province.Name + this.City.Name + this.County.Name; 382 } 383 } 384 385 /// <summary> 386 /// 重写ToString 387 /// </summary> 388 /// <returns>结果</returns> 389 public override string ToString() 390 { 391 return this.FullName; 392 } 393 } 394 395 /// <summary> 396 /// 代码名称映射 397 /// </summary> 398 public struct CodeNameMapping 399 { 400 /// <summary> 401 /// 代码 402 /// </summary> 403 private readonly string code; 404 405 /// <summary> 406 /// 名称 407 /// </summary> 408 private readonly string name; 409 410 /// <summary> 411 /// Initializes a new instance of the <see cref="CodeNameMapping"/> struct. 412 /// </summary> 413 /// <param name="code">代码</param> 414 /// <param name="name">名称</param> 415 internal CodeNameMapping(string code, string name) 416 { 417 this.code = code; 418 this.name = name; 419 } 420 421 /// <summary> 422 /// 代码 423 /// </summary> 424 public string Code 425 { 426 get { return this.code; } 427 } 428 429 /// <summary> 430 /// 名称 431 /// </summary> 432 public string Name 433 { 434 get { return this.name; } 435 } 436 437 /// <summary> 438 /// 重写比较 439 /// </summary> 440 /// <param name="obj">对象</param> 441 /// <returns>结果</returns> 442 public override bool Equals(object obj) 443 { 444 if (obj != null && obj is CodeNameMapping) 445 { 446 return ((CodeNameMapping)obj).Code == this.Code; 447 } 448 return false; 449 } 450 451 /// <summary> 452 /// GetHashCode 453 /// </summary> 454 /// <returns>HashCode</returns> 455 public override int GetHashCode() 456 { 457 return this.Code.GetHashCode(); 458 } 459 460 /// <summary> 461 /// 相等比较器 462 /// </summary> 463 /// <param name="left">left</param> 464 /// <param name="right">right</param> 465 /// <returns>结果</returns> 466 public static bool operator ==(CodeNameMapping left, CodeNameMapping right) 467 { 468 return left.Code != right.Code; 469 } 470 471 /// <summary> 472 /// 不相等比较器 473 /// </summary> 474 /// <param name="left">left</param> 475 /// <param name="right">right</param> 476 /// <returns>结果</returns> 477 public static bool operator !=(CodeNameMapping left, CodeNameMapping right) 478 { 479 return left.Code != right.Code; 480 } 481 } 482 }
xml配置文件
测试方法
1 private static void Validator() 2 { 3 // 正确的 4 Validator v = new Validator("330719196804253671"); 5 var rel = v.Execute(); 6 7 // 错误的 更改第5位数 8 Validator v1 = new Validator("330729196804253671"); 9 var rel1 = v1.Execute(); 10 }