這一篇文章是給大家介紹的是:.NET基礎(chǔ)編程之特性 - Attribute,對(duì)這一部分掌握不熟悉的同學(xué),可以仔細(xì)的看一下!
成都創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元江蘇做網(wǎng)站,已為上家服務(wù),為江蘇各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575一、特性簡(jiǎn)介
特性提供功能強(qiáng)大的方法,用以將元數(shù)據(jù)或聲明信息與代碼(程序集、類(lèi)型、方法、屬性等)相關(guān)聯(lián)。特性與程序?qū)嶓w關(guān)聯(lián)后,可在運(yùn)行時(shí)使用“反射”查詢特性。
特性具有以下屬性:
(1)特性可向程序中添加元數(shù)據(jù)。元數(shù)據(jù)是有關(guān)在程序中定義的類(lèi)型的信息。所有的 .NET 程序集都包含指定的一組元數(shù)據(jù),這些元數(shù)據(jù)描述在程序集中定義的類(lèi)型和類(lèi)型成員??梢蕴砑幼远x特性,以指定所需的任何附加信息。
(2)可以將一個(gè)或多個(gè)特性應(yīng)用到整個(gè)程序集、模塊或較小的程序元素(如類(lèi)和屬性)。
(3)特性可以與方法和屬性相同的方式接受參數(shù)。
(4)程序可以使用反射檢查自己的元數(shù)據(jù)或其他程序內(nèi)的元數(shù)據(jù)。
二、使用特性
特性可以放置在幾乎所有的聲明中(但特定的特性可能限制在其上有效的聲明類(lèi)型)。在 C# 中,特性的指定方法為:將括在方括號(hào)中的特性名置于其應(yīng)用到的實(shí)體的聲明上方。它必須位于所應(yīng)用于的元素的緊前面并與該元素在同一行。
[Serializable] //使用特性 SerializableAttribute
internal class MyClass
{
[DllImport("user32.dll")] //使用特性 DllImportAttribute
private static extern void Do();
#region 一個(gè)聲明上可放置多個(gè)特性
private void MethodA([In][Out]ref double n) { }
private void MethodB([In, Out]ref double n) { }
#endregion 一個(gè)聲明上可放置多個(gè)特性
#region 某些特性對(duì)于給定實(shí)體可以指定多次
[Conditional("DEBUG"), Conditional("TEST1")]
private void TraceMethod() { }
#endregion 某些特性對(duì)于給定實(shí)體可以指定多次
}
【注意】根據(jù)約定,所有特性名稱都以單詞“Attribute”結(jié)束,以便將它們與“.NET Framework”中的其他項(xiàng)區(qū)分。但是,在代碼中使用特性時(shí),不需要指定 attribute 后綴。
三、特性的參數(shù)
許多特性都有參數(shù),而這些參數(shù)可以是定位參數(shù)、未命名參數(shù)或命名參數(shù)。任何定位參數(shù)都必須按特定順序指定并且不能省略,而命名參數(shù)是可選的且可以按任意順序指定。首先指定定位參數(shù)。例如,這三個(gè)特性是等效的:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
第一個(gè)參數(shù)(DLL 名稱)是定位參數(shù)并且總是第一個(gè)出現(xiàn),其他參數(shù)為命名參數(shù)。在這種情況下,兩個(gè)命名參數(shù)均默認(rèn)為 false,因此可將其省略。
四、特性的目標(biāo)
特性的目標(biāo)是應(yīng)用該特性的實(shí)體。例如,特性可以應(yīng)用于類(lèi)、特定方法或整個(gè)程序集。默認(rèn)情況下,特性應(yīng)用于它后面的元素。但是,您也可以顯式標(biāo)識(shí)要將特性應(yīng)用于方法還是它的參數(shù)或返回值。
若
要顯式標(biāo)識(shí)特性目標(biāo),語(yǔ)法:
[target : attribute-list]
//示例:將特性應(yīng)用于程序集和模塊[assembly: AssemblyTitle("assembly 4.6.1")]
[module: CLSCompliant(true)]
//示例:將特性應(yīng)用于方法、方法參數(shù)和方法返回值
//默認(rèn):應(yīng)用于方法
[SomeAttr]
int Method1() { return 0; }
//指定應(yīng)用于方法
[method: SomeAttr]
int Method2() { return 0; }
//指定應(yīng)用于返回值
[return: SomeAttr]
int Method3() { return 0; }
五、特性的常見(jiàn)用途
以下列表包含特性的幾個(gè)常見(jiàn)用途:
(1)在 Web 服務(wù)中,使用 WebMethod 特性來(lái)標(biāo)記方法,以指示該方法應(yīng)該可通過(guò) SOAP 協(xié)議進(jìn)行調(diào)用。
(2)描述當(dāng)與本機(jī)代碼進(jìn)行交互操作時(shí)如何封送方法參數(shù)。有關(guān)更多信息。
(3)描述類(lèi)、方法和接口的 COM 屬性。
(4)使用 DllImportAttribute 類(lèi)調(diào)用非托管代碼。
(5)在標(biāo)題、版本、說(shuō)明或商標(biāo)方面描述您的程序集。
(6)描述要持久性序列化類(lèi)的哪些成員。
(7)描述如何映射類(lèi)成員和 XML 節(jié)點(diǎn)以便進(jìn)行 XML 序列化。
(8)描述方法的安全要求。
(9)指定用于強(qiáng)制安全性的特性。
(10)由實(shí)時(shí) (JIT) 編譯器控制優(yōu)化,以便易于調(diào)試代碼。
(11)獲取有關(guān)調(diào)用方的信息的方法。
六、創(chuàng)建自定義的特性
通過(guò)定義一個(gè)特性類(lèi),可以創(chuàng)建您自己的自定義特性。該特性類(lèi)直接或間接地從 Attribute 派生,有助于方便快捷地在元數(shù)據(jù)中標(biāo)識(shí)特性定義。
///
/// 角色特性
///
/// RoleAttribute:特性的名稱,繼承 Attribute,為自定義特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class RoleAttribute : Attribute
{
private string _name;
///
/// 啟用標(biāo)識(shí)
///
/// 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ù),任何公共的讀寫(xiě)字段或?qū)傩远际敲麉?shù)。
【注意】 AttributeUsage 特性,在這里它使得 Role 特性僅在類(lèi)和 struct 聲明中有效。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)] //AllowMultiple:該值指示能否為一個(gè)程序多次使用該特性
public class RoleAttribute : Attribute
{
//... ...
}
[Role("You")] //在同一個(gè)類(lèi)上多次使用
[Role("Me", IsEnable = true)]
public class OurClass
{
//... ...
}
注意:如果特性類(lèi)包含一個(gè)屬性,則該屬性必須為讀寫(xiě)屬性。
七、使用反射訪問(wèn)特性
使用反射,可檢索用自定義特性定義的信息。
主要方法是GetCustomAttributes,它返回對(duì)象數(shù)組,這些對(duì)象在運(yùn)行時(shí)等效于源代碼特性。
///
/// 角色特性
///
/// RoleAttribute:特性的名稱,繼承 Attribute,為自定義特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class RoleAttribute : Attribute
{
private string _name;
///
/// 啟用標(biāo)識(shí)
///
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 來(lái)獲取特性后才會(huì)執(zhí)行此代碼。對(duì) OurClass 調(diào)用 GetCustomAttributes 會(huì)導(dǎo)致按上述方式構(gòu)造并初始化一個(gè) RoleAttribute 對(duì)象。如果該類(lèi)具有其他特性,則按相似的方式構(gòu)造其他特性對(duì)象。
然后 GetCustomAttributes 返回 RoleAttribute 對(duì)象和數(shù)組中的任何其他特性對(duì)象。之后就可以對(duì)此數(shù)組進(jìn)行迭代,確定根據(jù)每個(gè)數(shù)組元素的類(lèi)型所應(yīng)用的特性,并從特性對(duì)象中提取信息。
這里,定義一個(gè)自定義特性,將其應(yīng)用于若干實(shí)體并通過(guò)反射進(jìn)行檢索。
///
/// 角色特性
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]
public class RoleAttribute : Attribute
{
private readonly string _name;
///
/// 啟用標(biāo)識(shí)
///
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}");
}
}
}
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。