NET 特性(Attribute) 轉自 "博客園(Fish)" "特性(Attribute)" :是用於在運行時傳遞程式中各種元素(比如類、方法、結構、枚舉、組件等)的行為信息的聲明性標簽。 您可以通過使用特性向程式添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括弧(\[ \]) ...
NET 特性(Attribute)
轉自 博客園(Fish)
特性(Attribute):是用於在運行時傳遞程式中各種元素(比如類、方法、結構、枚舉、組件等)的行為信息的聲明性標簽。
您可以通過使用特性向程式添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括弧([ ])來描述的。
特性(Attribute)用於添加元數據,如編譯器指令和註釋、描述、方法、類等其他信息。
.Net 框架提供了兩種類型的特性:預定義特性和自定義特性。
1.自定義特性:Net 框架允許創建自定義特性,用於存儲聲明性的信息,且可在運行時被檢索。該信息根據設計標準和應用程式需要,可與任何目標元素相關。
創建並使用自定義特性包含四個步驟:
- 聲明自定義特性
- 構建自定義特性
- 在目標程式元素上應用自定義特性
- 通過反射訪問特性
/// <summary>
/// 別名特性
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public class AliasAttribute : Attribute
{
/// <summary>
/// 別名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 別名類型
/// </summary>
public Type Type { get; set; }
/// <summary>
/// 別名名稱,類型預設為string
/// </summary>
/// <param name="name"></param>
public AliasAttribute(string name)
{
Name = name;
Type = typeof(string);
}
/// <summary>
/// 別名名稱,類型為傳入類型
/// </summary>
/// <param name="name"></param>
public AliasAttribute(string name, Type type)
{
Name = name;
Type = type;
}
}
2.在目標程式元素上應用自定義特性
public class UserDto
{
/// <summary>
/// 姓名
/// </summary>
[Alias("name", typeof(string))]
public string Name { get; set; }
/// <summary>
/// 電話
/// </summary>
[Alias("phone", typeof(string))]
public string Phone { get; set; }
/// <summary>
/// 備註
/// </summary>
[Alias("remark", typeof(string))]
public string Remark { get; set; }
}
3.通過反射訪問特性
// 獲取type
var userType = typeof(UserDto);
// 獲取類中所有公共屬性集合
var PropertyArr = userType.GetProperties();
foreach (var itemProperty in PropertyArr)
{
// 獲取屬性上存在AliasAttribute的數組
var customAttributesArr = itemProperty.GetCustomAttributes(typeof(AliasAttribute), true);
if (customAttributesArr.Any())
{
// 獲取特性
var first = customAttributesArr.FirstOrDefault();
}
else {
// 不存在特性
}
}