C#自定義特性實例

来源:http://www.cnblogs.com/roucheng/archive/2016/05/28/cstexing.html
-Advertisement-
Play Games

元數據,就是C#中封裝的一些類,無法修改.類成員的特性被稱為元數據中的註釋. 1、什麼是特性 (1)屬性與特性的區別 屬性(Property):屬性是面向對象思想里所說的封裝在類裡面的數據欄位,Get,Set方法。 特性(Attribute): 官方解釋:特性是給指定的某一聲明的一則附加的聲明性信息 ...


元數據,就是C#中封裝的一些類,無法修改.類成員的特性被稱為元數據中的註釋.

1、什麼是特性

     (1)屬性與特性的區別

         屬性(Property):屬性是面向對象思想里所說的封裝在類裡面的數據欄位,Get,Set方法。

         特性(Attribute):  官方解釋:特性是給指定的某一聲明的一則附加的聲明性信息。 允許類似關鍵字的描述聲明。它對程式中的元素進行標註,如類型、欄位、方法、屬性等。從.net角度看,特性是一種 類,這些類繼承於System.Attribute類,用於對類、屬性、方法、事件等進行描述,主要用在反射中。但從面向對象的級別看,其實Attribute是類型級別的,而不是對象級別。

         Attributes和.net文件的元素據保存在一起,可以用來向運行時描述你的代碼,或者在程式運行的時候影響程式的行為。

2、特性的應用

    (1).net中特性用來處理多種問題,比如序列化、程式的安全特性、防止即時編譯器對程式代碼進行優化從而代碼容易調試等等。

     定植特性的本質上是一個類的元素上去添加附加信息,併在運行其通過反射得到該附加信息(在使用數據實體對象時經常用到)

    (2)Attribute 作為編譯器的指令時的應用

         Conditional:起條件編譯的作用,只有滿足條件,才允許編譯器對它的代碼進行編譯。一般在程式調試的時候使用

         DllImport: 用來標記費.net的函數,表明該方法在一個外部的DLL中定義。

         Obsolete: 這個屬性用來標記當前的方法已經廢棄,不再使用

       註:Attribute是一個類,因此DllImport也是一個類,Attribute類是在編譯的時候實例化,而不是像通常那樣在運行時實例化。

         CLSCompliant: 保證整個程式集代碼遵守CLS,否則編譯將報錯。

 3、自定義特性

      使用AttributeUsage,來控制如何應用新定義的特性

     [AttributeUsageAttribute(AttributeTargets.All  可以應用到任何元素

      ,AllowMultiple=true, 允許應用多次,我們的定值特性能否被重覆放在同一個程式實體前多次。

      ,Inherited=false,不繼承到派生

        )]

      特性也是一個類,必須繼承於System.Attribute類,命名規範為“類名”+Attribute。不管是直接還是間接繼承,都會成為一個特性類,特性類的聲明定義了一種可以放置在聲明之上新的特性。

     public class MyselfAttribute:System.Attribute

4、自定義特性案例
     以下用一個類似於Hibernate中Session的Save()方法效果,自動持久化對象信息到資料庫來說明自定義特性的使用。

(1)建立Dept表

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

(2)自定義特性

/**************自定義特性類*****************/  
/// <summary>  
/// 作用:用來說明表名是什麼  
/// AttributeUsage:說明特性的目標元素是什麼  
/// AttributeTargets.Class:代表目標元素為Class  
/// </summary>  
[AttributeUsage(AttributeTargets.Class)]  
public class TableAttribute : Attribute{  
  
    /// <summary>  
    /// 表名  
    /// </summary>  
    public string TableName { get; set; }  
 
    #region 構造方法,可選的  
  
    public TableAttribute() {    }  
    public TableAttribute(string tableName) {  
        this.TableName = tableName;  
    }   
 
    #endregion  
}  
  
/**************自定義特性類*****************/  
/// <summary>  
/// 作用:說明列是否為自動增長列  
/// </summary>  
[AttributeUsage(AttributeTargets.Property)]  
class IdentityAttribute: Attribute  
{  
    /// <summary>  
    /// true:是; false:否  
    /// </summary>  
    public bool IsIdentity { get; set; }  
}  
  
/****************實體類***************/  
/// <summary>  
/// 有意將類名定義成與表名不一致  
/// 用Table特性來說明實體類對應的表名是什麼  
/// </summary>  
[Table(TableName = "Dept")]  
public class Department {  
  
    /// <summary>  
    /// 部門編號,用特性標註為自動增長  
    /// </summary>  
    [Identity(IsIdentity=true)]  
    public int DeptNo { get; set; }  
  
    /// <summary>  
    /// 部門名稱  
    /// </summary>  
    public string Dname { get; set; }  
  
    /// <summary>  
    /// 部門描述  
    /// </summary>  
    public string Description { get; set; }  
  
    public Department( string name, string desc) {  
        Dname = name;  
        Description = desc;  
    }  
}  
  
/****************執行持久化操作類***************/  
/// <summary>  
/// 執行持久化操作類  
/// </summary>  
public class ADOManager {  
  
    /// <summary>  
    /// 將對象的屬性值作為表中對應列的值來添加  
    /// </summary>  
    /// <param name="obj">要添加的對象</param>  
    public int Save(Object obj) {  
        //1.取得類名:代表表名,用到反射  
        string tableName = obj.GetType().Name;  
        //如果類有TableAttribute特性,在採用特性說明的類名  
        TableAttribute attr = Attribute.GetCustomAttribute(obj.GetType(), typeof(TableAttribute)) as TableAttribute;  
        if (attr != null) {//說明類加了Table特性  
            tableName = attr.TableName;//取得表名  
        }  
  
        //sql語句模板:insert into Dept(deptno,dname,description) values('2','','');  
        StringBuilder sql = new StringBuilder("insert into ");  
        sql.Append(tableName);  
        sql.Append(" (");  
  
        //迴圈對象的屬性名:取得列名  
        foreach (PropertyInfo item in obj.GetType().GetProperties()) {  
            //取得是否有自動增長的特性  
            IdentityAttribute att = Attribute.GetCustomAttribute(item, typeof(IdentityAttribute)) as IdentityAttribute;  
            if (att == null || !att.IsIdentity) {//沒有,則添加列  
                sql.Append(item.Name);  
                sql.Append(",");  
            }  
        }  
        //去除最後一個逗號'  
        sql.Remove(sql.Length - 1, 1);  
        sql.Append(") values(");  
        //迴圈取出對象的屬性值:為列賦值  
        foreach (PropertyInfo item in obj.GetType().GetProperties()) {  
            //取得是否有自動增長的特性  
            IdentityAttribute att = Attribute.GetCustomAttribute(item, typeof(IdentityAttribute)) as IdentityAttribute;  
            if (att == null) {//沒有,則追加列的值  
                //GetValue():obj代表什麼對象,null代表沒有參數  
                sql.Append("'" + item.GetValue(obj, null) + "'");  
                sql.Append(",");  
            }  
        }  
  
        //去除最後一個逗號'  
        sql.Remove(sql.Length - 1, 1);  
        sql.Append(")");  
        //查看完整的sql語句  
        Console.WriteLine(sql.ToString());  
  
        //執行sql語句  
        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;//返回執行結果  
    }  
}  
  /* 何問起 hovertree.com */
/****************測試類關鍵代碼***************/  
Department dept = new Department("開發部", "負責產品的研發");  
ADOManager manager = new ADOManager();  
int r = manager.Save(dept);  
  
Console.WriteLine(r==0?"失敗":"成功");  

小結:

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

特性其本質就是一個繼承了Attribute的類

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

特性將會影響其作用的目標元素的編譯和運行過程

使用自定義特性的步驟:

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

2. 在需要用的該特性的目標元素上添加特性

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是 WIN32 自動創建多級子目錄的 C++ 封裝類,用法簡單。 封裝沒有採用類的靜態函數方式,而是在構造函數裡面直接完成工作。沒什麼具體的原因,只是當時做成這樣了,這麼多年就一直這樣用了。 #ifndef lxx_hss_auto_create_folder_hss #define __HSS_... ...
  • http://code.csdn.net/news/2820879 想出一個難破解且容易記的密碼對不是一件簡單的事情。在我為電腦設定一個新密碼,或者線上註冊了一個新的賬號,需要輸入密碼的時候,腦袋就一片空白。不過,Linux下有幾個密碼生成工具可以使用,每一個工具都有自己的辦法生成安全的密碼。 1. ...
  • 最近用到了rsync的非同步非同備份,一個簡單的rsync同步配置,總結起來有以下幾個步驟: 1)服務端配置:vim /etc/rsyncd.conf 進入編輯,加入如下配置: 2) 創建所需要備份的目錄,添加上面配置的虛擬用戶:useradd wlpt -s /sbin/nologin. 3) 修改 ...
  • Hello, Android Android 開發與 Xamarin 簡介 在這兩節指南中,我們將 (使用 Xamarin Studio或 Visual Studio)建立我們的第一個 Xamarin.Android 應用程式 並理解使用Xamarin 開發Android 應用程式的基本原理的。在這 ...
  • 最近我一直在編寫適用於Windows 10商店的游戲.這款游戲比較怕玩家用修改器改金錢,因為這種修改會導致某些內購失效並且損害公平性。於是我把自己見過的三種反修改器的方法給網友們介紹一下。 首先說明一下我總結的防止游戲作弊的理念: 1.預防修改,防患於未然,讓可用的修改手段減少。 比如說,你讓你的U ...
  • WPF的中模板有三種:ControlTemplate、ItemsPanelTemplate、DataTemplate,他們繼承抽象類FrameworkTemplate,下麵是它們的繼承關係: Windows Presentation Foundation (WPF) 中的控制項具有 ControlTe... ...
  • 使用使用Aspose插件對Excel文檔進行導入導出操作 使用前請先下載Aspose插件引用 Excel導入: 前臺使用file標簽獲取,submit方式提交。 後臺接收: ...
  • 聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...