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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

C#

C#自定义特性实例

發(fā)布時(shí)間:2023/12/10 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#自定义特性实例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

元數(shù)據(jù),就是C#中封裝的一些類,無(wú)法修改.類成員的特性被稱為元數(shù)據(jù)中的注釋.

1、什么是特性

?????(1)屬性與特性的區(qū)別

?????????屬性(Property):屬性是面向?qū)ο笏枷肜锼f(shuō)的封裝在類里面的數(shù)據(jù)字段,Get,Set方法。

?????????特性(Attribute):??官方解釋:特性是給指定的某一聲明的一則附加的聲明性信息。 允許類似關(guān)鍵字的描述聲明。它對(duì)程序中的元素進(jìn)行標(biāo)注,如類型、字段、方法、屬性等。從.net角度看,特性是一種 類,這些類繼承于System.Attribute類,用于對(duì)類、屬性、方法、事件等進(jìn)行描述,主要用在反射中。但從面向?qū)ο蟮募?jí)別看,其實(shí)Attribute是類型級(jí)別的,而不是對(duì)象級(jí)別。

???????? Attributes和.net文件的元素?fù)?jù)保存在一起,可以用來(lái)向運(yùn)行時(shí)描述你的代碼,或者在程序運(yùn)行的時(shí)候影響程序的行為。

2、特性的應(yīng)用

????(1).net中特性用來(lái)處理多種問(wèn)題,比如序列化、程序的安全特性、防止即時(shí)編譯器對(duì)程序代碼進(jìn)行優(yōu)化從而代碼容易調(diào)試等等。

??? ?定植特性的本質(zhì)上是一個(gè)類的元素上去添加附加信息,并在運(yùn)行其通過(guò)反射得到該附加信息(在使用數(shù)據(jù)實(shí)體對(duì)象時(shí)經(jīng)常用到)

????(2)Attribute 作為編譯器的指令時(shí)的應(yīng)用

???????? Conditional:起條件編譯的作用,只有滿足條件,才允許編譯器對(duì)它的代碼進(jìn)行編譯。一般在程序調(diào)試的時(shí)候使用

???????? DllImport: 用來(lái)標(biāo)記費(fèi).net的函數(shù),表明該方法在一個(gè)外部的DLL中定義。

???????? Obsolete: 這個(gè)屬性用來(lái)標(biāo)記當(dāng)前的方法已經(jīng)廢棄,不再使用

?????? 注:Attribute是一個(gè)類,因此DllImport也是一個(gè)類,Attribute類是在編譯的時(shí)候?qū)嵗?/strong>,而不是像通常那樣在運(yùn)行時(shí)實(shí)例化。

???????? CLSCompliant: 保證整個(gè)程序集代碼遵守CLS,否則編譯將報(bào)錯(cuò)。

?3、自定義特性

??????使用AttributeUsage,來(lái)控制如何應(yīng)用新定義的特性

???? [AttributeUsageAttribute(AttributeTargets.All? 可以應(yīng)用到任何元素

????? ,AllowMultiple=true, 允許應(yīng)用多次,我們的定值特性能否被重復(fù)放在同一個(gè)程序?qū)嶓w前多次。

????? ,Inherited=false,不繼承到派生

??????? )]

????? 特性也是一個(gè)類,必須繼承于System.Attribute類,命名規(guī)范為“類名”+Attribute。不管是直接還是間接繼承,都會(huì)成為一個(gè)特性類,特性類的聲明定義了一種可以放置在聲明之上新的特性。

???? public class MyselfAttribute:System.Attribute

4、自定義特性案例
?????以下用一個(gè)類似于Hibernate中Session的Save()方法效果,自動(dòng)持久化對(duì)象信息到數(shù)據(jù)庫(kù)來(lái)說(shuō)明自定義特性的使用。

(1)建立Dept表

Create Table Dept( deptNo int identity(1,1) primary key, dname nvarchar(10) not null, description nvarchar(100) ) Go -- 何問(wèn)起 hovertree.com

(2)自定義特性

/**************自定義特性類*****************/ /// <summary> /// 作用:用來(lái)說(shuō)明表名是什么 /// AttributeUsage:說(shuō)明特性的目標(biāo)元素是什么 /// AttributeTargets.Class:代表目標(biāo)元素為Class /// </summary> [AttributeUsage(AttributeTargets.Class)] public class TableAttribute : Attribute{ /// <summary> /// 表名 /// </summary> public string TableName { get; set; } #region 構(gòu)造方法,可選的 public TableAttribute() { } public TableAttribute(string tableName) { this.TableName = tableName; } #endregion } /**************自定義特性類*****************/ /// <summary> /// 作用:說(shuō)明列是否為自動(dòng)增長(zhǎng)列 /// </summary> [AttributeUsage(AttributeTargets.Property)] class IdentityAttribute: Attribute { /// <summary> /// true:是; false:否 /// </summary> public bool IsIdentity { get; set; } } /****************實(shí)體類***************/ /// <summary> /// 有意將類名定義成與表名不一致 /// 用Table特性來(lái)說(shuō)明實(shí)體類對(duì)應(yīng)的表名是什么 /// </summary> [Table(TableName = "Dept")] public class Department { /// <summary> /// 部門(mén)編號(hào),用特性標(biāo)注為自動(dòng)增長(zhǎng) /// </summary> [Identity(IsIdentity=true)] public int DeptNo { get; set; } /// <summary> /// 部門(mén)名稱 /// </summary> public string Dname { get; set; } /// <summary> /// 部門(mén)描述 /// </summary> public string Description { get; set; } public Department( string name, string desc) { Dname = name; Description = desc; } } /****************執(zhí)行持久化操作類***************/ /// <summary> /// 執(zhí)行持久化操作類 /// </summary> public class ADOManager { /// <summary> /// 將對(duì)象的屬性值作為表中對(duì)應(yīng)列的值來(lái)添加 /// </summary> /// <param name="obj">要添加的對(duì)象</param> public int Save(Object obj) { //1.取得類名:代表表名,用到反射 string tableName = obj.GetType().Name; //如果類有TableAttribute特性,在采用特性說(shuō)明的類名 TableAttribute attr = Attribute.GetCustomAttribute(obj.GetType(), typeof(TableAttribute)) as TableAttribute; if (attr != null) {//說(shuō)明類加了Table特性 tableName = attr.TableName;//取得表名 } //sql語(yǔ)句模板:insert into Dept(deptno,dname,description) values('2','',''); StringBuilder sql = new StringBuilder("insert into "); sql.Append(tableName); sql.Append(" ("); //循環(huán)對(duì)象的屬性名:取得列名 foreach (PropertyInfo item in obj.GetType().GetProperties()) { //取得是否有自動(dòng)增長(zhǎng)的特性 IdentityAttribute att = Attribute.GetCustomAttribute(item, typeof(IdentityAttribute)) as IdentityAttribute; if (att == null || !att.IsIdentity) {//沒(méi)有,則添加列 sql.Append(item.Name); sql.Append(","); } } //去除最后一個(gè)逗號(hào)' sql.Remove(sql.Length - 1, 1); sql.Append(") values("); //循環(huán)取出對(duì)象的屬性值:為列賦值 foreach (PropertyInfo item in obj.GetType().GetProperties()) { //取得是否有自動(dòng)增長(zhǎng)的特性 IdentityAttribute att = Attribute.GetCustomAttribute(item, typeof(IdentityAttribute)) as IdentityAttribute; if (att == null) {//沒(méi)有,則追加列的值 //GetValue():obj代表什么對(duì)象,null代表沒(méi)有參數(shù) sql.Append("'" + item.GetValue(obj, null) + "'"); sql.Append(","); } } //去除最后一個(gè)逗號(hào)' sql.Remove(sql.Length - 1, 1); sql.Append(")"); //查看完整的sql語(yǔ)句 Console.WriteLine(sql.ToString()); //執(zhí)行sql語(yǔ)句 SqlConnection conn = new SqlConnection("server=.;database=test;integrated security=true"); SqlCommand comm = new SqlCommand(sql.ToString(), conn); conn.Open(); int r = comm.ExecuteNonQuery(); conn.Close(); return r;//返回執(zhí)行結(jié)果 } } /* 何問(wèn)起 hovertree.com */ /****************測(cè)試類關(guān)鍵代碼***************/ Department dept = new Department("開(kāi)發(fā)部", "負(fù)責(zé)產(chǎn)品的研發(fā)"); ADOManager manager = new ADOManager(); int r = manager.Save(dept); Console.WriteLine(r==0?"失敗":"成功");

小結(jié):

C#的特性類和Java中的元注釋一樣

特性其本質(zhì)就是一個(gè)繼承了Attribute的類

使用使可以省略Attribute結(jié)尾,如:TableAttribute =>> Table

特性將會(huì)影響其作用的目標(biāo)元素的編譯和運(yùn)行過(guò)程

使用自定義特性的步驟:

1. 定義特性類,類必須直接或間接繼承字Attribute類

2. 在需要用的該特性的目標(biāo)元素上添加特性

3. 在使用添加了特性的類的使用,獲取并使用自特定特性的信息

推薦:http://www.cnblogs.com/roucheng/p/dushubiji.html

總結(jié)

以上是生活随笔為你收集整理的C#自定义特性实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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