日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 中特性(Attribute)的使用简介

發(fā)布時(shí)間:2025/3/19 C# 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 中特性(Attribute)的使用简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Attribute(特性)
MSDN給出的定義:
  Attribute 類將預(yù)定義的系統(tǒng)信息或用戶定義的自定義信息與目標(biāo)元素相關(guān)聯(lián)。目標(biāo)元素可以是程序集、類、構(gòu)造函數(shù)、委托、枚舉、事件、字段、接口、方法、可移植可執(zhí)行文件模塊、參數(shù)、屬性 (Property)、返回值、結(jié)構(gòu)或其他特性(Attribute)。
在.Net程序中,可以使用特性(Attribute)來解決許多問題。如:將WebService中接口函數(shù)標(biāo)記為WebMethod,將類標(biāo)記為可序列化等等。

  此外,我們也可以自定義Attribute,來實(shí)現(xiàn)我們需要的功能。但自定義Attribute必須繼承自Attribute類。Attribute中有很多方法或者屬性,為我們提供了強(qiáng)大的功能。一般我們通過反射的方式來使用Attribute。

下面結(jié)合實(shí)際項(xiàng)目中的使用談?wù)勛约旱捏w會(huì)。
需求:項(xiàng)目中有一個(gè)專門的日志庫。現(xiàn)在項(xiàng)目中需要前端用到查詢、翻頁、按各個(gè)字段排序等等功能。由于日志數(shù)據(jù)可能有無效的數(shù)據(jù),并且數(shù)據(jù)量較大。為了提升統(tǒng)計(jì)、翻頁性能,所以建立了許多臨時(shí)表。如果在實(shí)際操作中為一個(gè)一個(gè)不同的需求去建立臨時(shí)表,造成代碼大量重復(fù)臃腫,并且不便于統(tǒng)一管理,考慮到的方案是通過Attribute的方式,統(tǒng)一建臨時(shí)表。
主體思路如下:通過自定義特性來描述要建立臨時(shí)表的字段的相關(guān)類型、長度等等信息,然后通過反射的方式獲取這些字段對應(yīng)的這些特性,然后構(gòu)造相應(yīng)的SQL命令就可以完成臨時(shí)表的建立了。
特性定義如下:

[AttributeUsage(AttributeTargets.Property)] public class TableFieldAttribute : Attribute { /// <summary> /// 字段長度 /// </summary> public int Length { get; set; }/// <summary> /// 字段描述 /// </summary> public string Describe { get; set; }/// <summary> /// 字段類型 /// </summary> public string Type { get; set; }}

  

以上AttributeUsage,也是一個(gè)繼承自Attribute的類,他的作用就是標(biāo)志自定義類的使用范圍,如:字段,屬性,類,方法。以及使用我們自定義類
標(biāo)記的類的子類是否繼承特性等。
有了這個(gè)自定義特性,將它運(yùn)用到實(shí)體上就行了。

public class TableEntity { [TableField(Describe = "Guid主鍵", Length = 36, Type = "uniqueidentifier")] public Guid Guid { get; set; }[TableField(Describe = "名稱", Length = 36, Type = "varchar ")] public string Name { get; set; } }

  

這樣在實(shí)體定義上,我們就已經(jīng)有了定義好了數(shù)據(jù)類型,長度等等。在實(shí)際要建臨時(shí)表時(shí),通過反射要建臨時(shí)表的實(shí)體,便能構(gòu)造相應(yīng)的SQL命令了。

工具類的定義:public class Tools<T> where T : class。實(shí)際使用時(shí),將泛型類型換成相應(yīng)的類型即可。
主要給出如何使用反射來獲取臨時(shí)表具體字段的信息代碼:

public static List<Record> GetTableFieldsInformation() { Type t = typeof(T); PropertyInfo[] propertyInfos = t.GetProperties(); List<Record> tableEntities = new List<Record>(); propertyInfos.ToList().ForEach(property => { IList<CustomAttributeData> list = property.GetCustomAttributesData(); if (list.Count == 1) { tableEntities.Add(GetTableEntity(list[0].NamedArguments, property)); } else { throw new Exception(); } }); return tableEntities; }

  


這樣, GetTableFieldsInformation()方法中返回的List就是包含了臨時(shí)表一個(gè)字段的所有信息的列表。我們循環(huán)列表,構(gòu)造Sql命令
主要代碼如下:

recordEntities.ForEach(record => { if (i == 0) { sql = "CREATE TABLE [" + record.TableName + "]("; } if (list.All(item => !record.Type.Equals(item, StringComparison.OrdinalIgnoreCase))) { sql += string.Format("{0} {1}({2}),", record.FieldName, record.Type, record.Length); } else { sql += string.Format("{0} {1},", record.FieldName, record.Type); } i++; });

  

程序最終執(zhí)行后如下圖:


主要的思想就是這些。另外,如果你細(xì)心,你會(huì)發(fā)現(xiàn)AttributeUsage特性使用和我定義的TableFieldAttribute使用方式上有寫不一樣。
TableFieldAttribute的使用方式:[TableField(Describe = "Guid主鍵", Length = 36, Type = "uniqueidentifier")]
AttributeUsage的使用方式:[AttributeUsage(AttributeTargets.Property)]。
同樣是自定義的特性,為什么我們定義的和Framework庫里的使用不一樣呢。?通過Reflect看看AttributeUsage的源碼,如下圖:

從圖中標(biāo)記的地方來看,是由于在AttributeUsage中屬性的定義【 AttributeTargets ValidOn】以及構(gòu)造函數(shù)的定義不一樣導(dǎo)致的。
有興趣深入研究的同學(xué)可以自己試試。

后記:特性的使用是很強(qiáng)大的一項(xiàng)功能。本例中使用的僅僅是其他很小的一部分。因此只對在實(shí)際應(yīng)用中做了寫說明。另:代碼是沒有經(jīng)過細(xì)致整理

代碼下載:http://files.cnblogs.com/tyb1222/Attributes.rar

總結(jié)

以上是生活随笔為你收集整理的C# 中特性(Attribute)的使用简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。