當前位置: 妍妍網 > 碼農

.NET 中 特性+反射 實作數據校驗

2024-06-10碼農

前言

在.NET中,我們可以使用特性+反射來實作數據校驗。特性是一種用於為程式中的程式碼添加後設資料的機制。後設資料是與程式中的程式碼相關聯的數據,但不直接成為程式碼的一部份。

透過特性,我們可以為類、方法、內容等添加額外的資訊,這些資訊可以在執行時透過反射獲取和使用。

為了實作數據校驗,我們可以定義一個自訂特性,並將其套用於需要校驗的內容或參數上。

然後,我們可以編寫程式碼來檢查這些特性,並根據特性的配置執行相應的校驗邏輯。

正文

定義自訂特性

using System;
using System.ComponentModel.DataAnnotations;
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public classValidationAttribute : Attribute
{
publicstring ErrorMessage { getset; }
publicValidationAttribute(string errorMessage)
{
ErrorMessage = errorMessage;
}
}

定義具體的校驗特性

[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public classRequiredAttribute : ValidationAttribute
{
publicRequiredAttribute() : base("該欄位是必填項。") { }
}
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public classRangeAttribute : ValidationAttribute
{
publicint Minimum { getset; }
publicint Maximum { getset; }
publicRangeAttribute(int minimum, int maximum, string errorMessage = "該欄位的值必須在 {0} 和 {1} 之間。")
base(errorMessage)

{
Minimum = minimum;
Maximum = maximum;
}
}

在模型類中使用這些特性

public classPerson
{
[Required]
publicstring Name { getset; }
[Range(18, 100, ErrorMessage = "年齡必須在 18 到 100 之間。")]
publicint Age { getset; }
}

編寫驗證方法

public classValidator
{
publicstaticbool Validate<T>(T obj, outstring errorMessage)
{
errorMessage = null;
var type = typeof(T);
var properties = type.GetProperties();
foreach (var property in properties)
{
var validationAttributes = property.GetCustomAttributes(typeof(ValidationAttribute), true);
foreach (var attribute in validationAttributes)
{
varvalue = property.GetValue(obj);
switch (attribute)
{
case RequiredAttribute required:
if (value == null || (valueisstring str && string.IsNullOrWhiteSpace(str)))
{
errorMessage = required.ErrorMessage;
returnfalse;
}
break;
case RangeAttribute range:
if (valueis IComparable comparable)
{
if (comparable.CompareTo(range.Minimum) < 0 || comparable.CompareTo(range.Maximum) > 0)
{
errorMessage = string.Format(range.ErrorMessage, range.Minimum, range.Maximum);
returnfalse;
}
}
break;
// 可以添加更多校驗特性型別
}
}
}
returntrue;
}
}



使用Validator類來校驗Person物件

classProgram
{
staticvoidMain(string[] args)
{
var person = new Person { Name = "張三", Age = 15 };
string errorMessage;
bool isValid = Validator.Validate(person, out errorMessage);
if (!isValid)
{
Console.WriteLine(errorMessage); // 輸出:該欄位是必填項。
}
Console.ReadLine();
}
}

總結

這個範例演示了如何使用特性和反射實作基本的數據校驗。在實際套用中,你可能需要處理更復雜的校驗邏輯和更多的校驗型別。

此外,還可以使用現有的數據特性(如System.ComponentModel.DataAnnotations名稱空間中的特性)來簡化校驗過程。

以下是該名稱空間中一些常用的特性(Attribute),以及它們的用途:

特性名稱 用途
[Required] 確保內容值不為空(不為 null 且對於字串不是空字串)。
[StringLength] 限制字串內容的最大長度。
[Range] 確保數值型內容在指定的範圍內。
[Minimum] 確保數值型內容不小於指定的最小值。
[Maximum] 確保數值型內容不大於指定的最大值。
[RegularExpression] 透過正規表式驗證內容值的格式。
[EmailAddress] 驗證內容值是否為有效的電子信件地址。
[Url] 驗證內容值是否為有效的 URL。
[Phone] 驗證內容值是否為有效的電話號碼。
[CreditCard] 驗證內容值是否為有效的信用卡號。
[Compare] 比較兩個內容值是否相等,常用於密碼和確認密碼的欄位。
[DataType] 指定數據的型別,例如日期、時間、電話號碼等,並不驗證數據,而是提供給數據繫結機制。
[CustomValidation] 允許指定自訂驗證邏輯。
[EnumDataType] 驗證內容值是否為指定列舉型別中的有效成員。
[StringLength] 驗證字串長度是否在指定的範圍內。

這些特性通常與ASP.NET Core 或是 ASP.NET MVC、Entity Framework等框架結合使用。

使用這些特性可以大大簡化數據驗證的程式碼,並且使驗證邏輯與業務邏輯分離,提高程式碼的可維護性和可讀性。

轉自:夢想航路

連結:cnblogs.com/cqai/p/18201804

- EOF -

推薦閱讀 點選標題可跳轉

看完本文有收獲?請轉發分享給更多人

推薦關註「DotNet」,提升.Net技能

點贊和在看就是最大的支持❤️