欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

.NET基礎編程之特性-Attribute

這一篇文章是給大家介紹的是:.NET基礎編程之特性 - Attribute,對這一部分掌握不熟悉的同學,可以仔細的看一下!

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,鹽城企業(yè)網(wǎng)站建設,鹽城品牌網(wǎng)站建設,網(wǎng)站定制,鹽城網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,鹽城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

      一、特性簡介

特性提供功能強大的方法,用以將元數(shù)據(jù)或聲明信息與代碼(程序集、類型、方法、屬性等)相關(guān)聯(lián)。特性與程序?qū)嶓w關(guān)聯(lián)后,可在運行時使用“反射”查詢特性。

特性具有以下屬性:

(1)特性可向程序中添加元數(shù)據(jù)。元數(shù)據(jù)是有關(guān)在程序中定義的類型的信息。所有的 .NET 程序集都包含指定的一組元數(shù)據(jù),這些元數(shù)據(jù)描述在程序集中定義的類型和類型成員。可以添加自定義特性,以指定所需的任何附加信息。

(2)可以將一個或多個特性應用到整個程序集、模塊或較小的程序元素(如類和屬性)。

(3)特性可以與方法和屬性相同的方式接受參數(shù)。

(4)程序可以使用反射檢查自己的元數(shù)據(jù)或其他程序內(nèi)的元數(shù)據(jù)。

二、使用特性

特性可以放置在幾乎所有的聲明中(但特定的特性可能限制在其上有效的聲明類型)。在 C# 中,特性的指定方法為:將括在方括號中的特性名置于其應用到的實體的聲明上方。它必須位于所應用于的元素的緊前面并與該元素在同一行。

[Serializable] //使用特性 SerializableAttribute

internal class MyClass

{

[DllImport("user32.dll")] //使用特性 DllImportAttribute

private static extern void Do();

#region 一個聲明上可放置多個特性

private void MethodA([In][Out]ref double n) { }

private void MethodB([In, Out]ref double n) { }

#endregion 一個聲明上可放置多個特性

#region 某些特性對于給定實體可以指定多次

[Conditional("DEBUG"), Conditional("TEST1")]

private void TraceMethod() { }

#endregion 某些特性對于給定實體可以指定多次

}

【注意】根據(jù)約定,所有特性名稱都以單詞“Attribute”結(jié)束,以便將它們與“.NET Framework”中的其他項區(qū)分。但是,在代碼中使用特性時,不需要指定 attribute 后綴。

三、特性的參數(shù)

許多特性都有參數(shù),而這些參數(shù)可以是定位參數(shù)、未命名參數(shù)或命名參數(shù)。任何定位參數(shù)都必須按特定順序指定并且不能省略,而命名參數(shù)是可選的且可以按任意順序指定。首先指定定位參數(shù)。例如,這三個特性是等效的:

[DllImport("user32.dll")]

[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]

第一個參數(shù)(DLL 名稱)是定位參數(shù)并且總是第一個出現(xiàn),其他參數(shù)為命名參數(shù)。在這種情況下,兩個命名參數(shù)均默認為 false,因此可將其省略。

四、特性的目標

特性的目標是應用該特性的實體。例如,特性可以應用于類、特定方法或整個程序集。默認情況下,特性應用于它后面的元素。但是,您也可以顯式標識要將特性應用于方法還是它的參數(shù)或返回值。

要顯式標識特性目標,語法:

[target : attribute-list]

.NET基礎編程之特性 - Attribute

//示例:將特性應用于程序集和模塊[assembly: AssemblyTitle("assembly 4.6.1")]

[module: CLSCompliant(true)]

//示例:將特性應用于方法、方法參數(shù)和方法返回值

//默認:應用于方法

[SomeAttr]

int Method1() { return 0; }

//指定應用于方法

[method: SomeAttr]

int Method2() { return 0; }

//指定應用于返回值

[return: SomeAttr]

int Method3() { return 0; }

五、特性的常見用途

以下列表包含特性的幾個常見用途:

(1)在 Web 服務中,使用 WebMethod 特性來標記方法,以指示該方法應該可通過 SOAP 協(xié)議進行調(diào)用。

(2)描述當與本機代碼進行交互操作時如何封送方法參數(shù)。有關(guān)更多信息。

(3)描述類、方法和接口的 COM 屬性。

(4)使用 DllImportAttribute 類調(diào)用非托管代碼。

(5)在標題、版本、說明或商標方面描述您的程序集。

(6)描述要持久性序列化類的哪些成員。

(7)描述如何映射類成員和 XML 節(jié)點以便進行 XML 序列化。

(8)描述方法的安全要求。

(9)指定用于強制安全性的特性。

(10)由實時 (JIT) 編譯器控制優(yōu)化,以便易于調(diào)試代碼。

(11)獲取有關(guān)調(diào)用方的信息的方法。

六、創(chuàng)建自定義的特性

通過定義一個特性類,可以創(chuàng)建您自己的自定義特性。該特性類直接或間接地從 Attribute 派生,有助于方便快捷地在元數(shù)據(jù)中標識特性定義。

///

/// 角色特性

///

/// RoleAttribute:特性的名稱,繼承 Attribute,為自定義特性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

public class RoleAttribute : Attribute

{

private string _name;

///

/// 啟用標識

///

/// IsEnable:命名參數(shù)

public bool IsEnable { get; set; }

///

/// 構(gòu)造函數(shù)

///

///

/// name:定位參數(shù)

public RoleAttribute(string name)

{

_name = name;

}

}

[Role("Me", IsEnable = true)] //調(diào)用特性的方式

public class OurClass

{

}

構(gòu)造函數(shù)的參數(shù)是自定義特性的定位參數(shù),任何公共的讀寫字段或?qū)傩远际敲麉?shù)。

【注意】 AttributeUsage 特性,在這里它使得 Role 特性僅在類和 struct 聲明中有效。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]  //AllowMultiple:該值指示能否為一個程序多次使用該特性

public class RoleAttribute : Attribute

{

//... ...

}

[Role("You")]            //在同一個類上多次使用

[Role("Me", IsEnable = true)]

public class OurClass

{

//... ...

}

注意:如果特性類包含一個屬性,則該屬性必須為讀寫屬性。

七、使用反射訪問特性

使用反射,可檢索用自定義特性定義的信息。

主要方法是GetCustomAttributes,它返回對象數(shù)組,這些對象在運行時等效于源代碼特性。

///

/// 角色特性

///

/// RoleAttribute:特性的名稱,繼承 Attribute,為自定義特性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

public class RoleAttribute : Attribute

{

private string _name;

///

/// 啟用標識

///

public bool IsEnable { get; set; }

///

/// 構(gòu)造函數(shù)

///

///

public RoleAttribute(string name)

{

_name = name;

}

}

RoleAttribute.cs

[Role("Me", IsEnable = true)]

public class OurClass

{

//... ...

}

概念上等效于

RoleAttribute role = new RoleAttribute("Me");

role.IsEnable = true;

但是,直到查詢 OurClass 來獲取特性后才會執(zhí)行此代碼。對 OurClass 調(diào)用 GetCustomAttributes 會導致按上述方式構(gòu)造并初始化一個 RoleAttribute 對象。如果該類具有其他特性,則按相似的方式構(gòu)造其他特性對象。

然后 GetCustomAttributes 返回 RoleAttribute 對象和數(shù)組中的任何其他特性對象。之后就可以對此數(shù)組進行迭代,確定根據(jù)每個數(shù)組元素的類型所應用的特性,并從特性對象中提取信息。

這里,定義一個自定義特性,將其應用于若干實體并通過反射進行檢索。

///

/// 角色特性

///

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]

public class RoleAttribute : Attribute

{

private readonly string _name;

///

/// 啟用標識

///

public bool IsEnable { get; set; }

///

/// 構(gòu)造函數(shù)

///

///

public RoleAttribute(string name)

{

_name = name;

}

public string GetName()

{

return _name;

}

}

class MyClass1 { }

[Role("Me")]

class MyClass2 { }

[Role("Me"), Role("You", IsEnable = true)]

class MyClass3 { }

class Program

{

static void Main(string[] args)

{

Output(typeof(MyClass1));

Output(typeof(MyClass2));

Output(typeof(MyClass3));

Console.Read();

}

///

/// 輸出

///

///

static void Output(Type t)

{

Console.WriteLine($"Class: {t}");

var attributes = t.GetCustomAttributes();

foreach (var attribute in attributes)

{

var attr = attribute as RoleAttribute;

if (attr == null)

{

return;

}

Console.WriteLine($" Name: {attr.GetName()}, IsEnable: {attr.IsEnable}");

}

}

}

.NET基礎編程之特性 - Attribute

本文標題:.NET基礎編程之特性-Attribute
網(wǎng)站網(wǎng)址:http://chinadenli.net/article32/goiesc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管網(wǎng)站設計公司面包屑導航網(wǎng)站設計自適應網(wǎng)站網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營