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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...