欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章說通C#的屬性Attribute

 更新時(shí)間:2021年04月14日 09:28:33   作者:老王Plus的老王  
這篇文章主要給大家介紹了如何通過一篇文章說通C#的屬性Attribute,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

屬性Attributes這個(gè)東西,用好了可以省N多代碼。

一、屬性

屬性Attributes在C#中很常用,但事實(shí)上很多人對(duì)這個(gè)東西又很陌生。

從概念上講,屬性提供的是將元數(shù)據(jù)關(guān)系到元素的一種方式。

屬性使用的樣子,應(yīng)該都見過:

[Flags] //Attribute
public enum DayOfWeek
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}

代碼中,F(xiàn)lags就是一個(gè)屬性。

通常,屬性會(huì)放在類、字段、方法等定義的上面,用來指定特定的內(nèi)容。

.Net Framework框架提供了一些屬性。像常見的Serializable,用來告訴編譯器當(dāng)前的類可以序列化成JSON或XML:

[Serializable]
public class SerializableClass { /*...*/ }

需要注意的是,屬性在編譯時(shí)會(huì)嵌入到程序集中。這樣,我們可以使用反射來獲得相應(yīng)的屬性值。

二、自定義屬性

自定義屬性用處很大,算是我自己比較常用的一個(gè)技術(shù)。

自定義屬性需要從System.Attribute抽象類來繼承。

想象一個(gè)場景。我們在構(gòu)建一個(gè)手機(jī)類。我們需要一個(gè)屬性來表示手機(jī)一些信息,比方口牌和生產(chǎn)年份:

public class MobileInformationAttribute : Attribute
{
    public string brand { get; set; }
    public int yearOfProduct { get; set; }

    public MobileInformationAttribute(string Brand, int YearOfProduct)
    {
        brand = Brand;
        yearOfProduct = YearOfProduct;
    }
}

我們會(huì)注意到:屬性是一個(gè)類,和其它類一樣,擁有字段、方法、構(gòu)造函數(shù)和其它成員。

三、使用屬性

前面說了,屬性可以放在類、字段、方法等定義的上面。

我們來看看上面這個(gè)自定義屬性的使用:

[MobileInformation("Apple", 2021)]
public class IPhone12 { /*...*/ }

這兒需要注意一下:對(duì)于自定義屬性的名字,如果我們采用xxx+Attribute的名稱,則使用時(shí)我們可以用短名稱xxx。否則,就需要使用完整的名稱:

public class abc : Attribute { /*...*/ }

[abc("Apple", 2021)]
public class IPhone12 { /*...*/ }

四、限制屬性

屬性本身也是一個(gè)類。所以屬性也可以用屬性來指定和修飾。

在修飾屬性的屬性中,有一個(gè)框架中的屬性用的很多,就是AttributeUsage。這個(gè)屬性用來限制自定義屬性可以修飾的元素類型:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
public class MobileInformationAttribute : Attribute { /*...*/ }

AttributeTargets是一個(gè)枚舉,有很多選項(xiàng),包括類、接口、方法、構(gòu)造函數(shù)、枚舉、程序集等。

上邊的代碼,我們限定了屬性只用于指定和修飾類和接口。所以,如果用這個(gè)屬性來修飾一個(gè)字段,編譯器會(huì)報(bào)錯(cuò)。

AttributeUsage還允許我們定義從修飾對(duì)象繼承的對(duì)象,是否也獲得屬性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited = true)]
public class MobileInformationAttribute : Attribute { /*...*/ }

以及該屬性是否可以在一個(gè)元素上有多個(gè)實(shí)例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
public class MobileInformationAttribute : Attribute { /*...*/ }

五、訪問屬性

有了屬性,怎么訪問呢?

框架提供了一個(gè)方法Attribute.GetCustomAttribute():

var mobileType = typeof(IPhone12);
var attributeType = typeof(MobileInformationAttribute);
var attribute = (MobileInformationAttribute)Attribute.GetCustomAttribute(mobileType, attributeType);
Console.WriteLine($"Mobile is {attribute.brand} {attribute.yearOfProduct}");

六、反射訪問

反射最主要的作用,是用來收集對(duì)象的數(shù)據(jù),而不是對(duì)象本身的數(shù)據(jù)。這些數(shù)據(jù)包括對(duì)象的類型,以及關(guān)于對(duì)象成員(包括方法、屬性、構(gòu)造函數(shù))的信息,和關(guān)于特定程序集的信息。此外,還包括存儲(chǔ)在元素屬性中的任何信息。

最簡單的反射,就是GetType()方法。

int myInt = 5;
Type type = myInt.GetType();
Console.WriteLine(type);

除此之外,我們還可以使用反射來獲取關(guān)于包含給定類型的程序集的信息:

Assembly assembly = typeof(DateTime).Assembly;
Console.WriteLine(assembly);

Assembly mobileAssembly = typeof(IPhone12).Assembly;
Console.WriteLine(mobileAssembly);

關(guān)于反射的內(nèi)容,不展開討論。

這兒說的,是通過反射獲取類中方法的信息:

public class ReflectedClass
{
    public string Property1 { get; set; }

    public int Add(int first, int second)
    {
        return first + second;
    }
}

ReflectedClass reflected = new ReflectedClass();
MemberInfo member = reflected.GetType().GetMethod("Add");
Console.WriteLine(member); //Int32 Add(Int32, Int32)

同樣,還可能通過反射獲得關(guān)于已定義的屬性的信息,以及關(guān)于對(duì)象的構(gòu)造函數(shù)的信息:

PropertyInfo property = reflected.GetType().GetProperty("Property1");
Console.WriteLine(property); //System.String Property1

ConstructorInfo constructor = reflected.GetType().GetConstructor(new Type[0]);
Console.WriteLine(constructor); //Void .ctor()

七、使用反射創(chuàng)建實(shí)例

這個(gè)需要用到system.Activator。這是一個(gè)非常強(qiáng)大的類,可以從類型創(chuàng)建對(duì)象的實(shí)例。

來看看這個(gè)方法的使用:

ReflectedClass newReflected = new ReflectedClass();

var reflectedType = newReflected.GetType();

object newObject = Activator.CreateInstance(reflectedType);
Console.WriteLine(newObject);

八、使用反射處理泛型

使用反射處理泛型會(huì)比處理普通類型麻煩一點(diǎn)。

這里需要知道,Type類上有一個(gè)屬性用來標(biāo)識(shí)類型是不是泛型:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine(numbers.GetType().IsGenericType);

同樣,我們也可以用反射來創(chuàng)建一個(gè)泛型的實(shí)例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7 };

Type d = numbers.GetType().GetGenericTypeDefinition();

Type[] typeArgs = new Type[] { typeof(int) };

Type constructed = d.MakeGenericType(typeArgs);

object list = Activator.CreateInstance(constructed);

Console.WriteLine(list.GetType());

有一點(diǎn)復(fù)雜,但可以實(shí)現(xiàn)。

九、總結(jié)

寫得好像有點(diǎn)亂。

總結(jié)一下,屬性將元數(shù)據(jù)分配給元素,包括類、字段、方法等等。該元數(shù)據(jù)在構(gòu)建項(xiàng)目時(shí)被編譯,并描述元素,而不是元素的數(shù)據(jù)。

可以創(chuàng)建從Attribute類繼承的自定義屬性??梢允褂肁ttributeUsage屬性來限制這些屬性的使用位置,并且可以使用反射來獲取屬性數(shù)據(jù)。

反射是一種技術(shù),允許獲取關(guān)于元素(而不是元素本身)的元數(shù)據(jù)和信息。執(zhí)行反射的最基本方法是使用GetType()方法,但是也可以使用反射來獲取關(guān)于方法、構(gòu)造函數(shù)、字段等的信息。

可以使用反射來創(chuàng)建對(duì)象的實(shí)例,只要有了對(duì)象的類型。同時(shí),使用反射創(chuàng)建泛型對(duì)象是可能的,但比較復(fù)雜,需要泛型對(duì)象的類型以及所有泛型參數(shù)的類型。

到此這篇關(guān)于一篇文章說通C#的屬性Attribute的文章就介紹到這了,更多相關(guān)C#屬性Attribute內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    TFTP不僅有斷點(diǎn)續(xù)傳,多用戶級(jí)別限制等功能,本文主要介紹了C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • C# 擴(kuò)展方法小結(jié)

    C# 擴(kuò)展方法小結(jié)

    這篇文章主要介紹了C#的擴(kuò)展方法的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • C#實(shí)現(xiàn)最簡單的文本加密方法

    C#實(shí)現(xiàn)最簡單的文本加密方法

    這篇文章主要介紹了C#實(shí)現(xiàn)最簡單的文本加密方法,可實(shí)現(xiàn)簡單的文本加密功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • SQLServer批量插入數(shù)據(jù)的三種方式及性能對(duì)比

    SQLServer批量插入數(shù)據(jù)的三種方式及性能對(duì)比

    本文詳細(xì)講解了SQLServer批量插入數(shù)據(jù)的三種方式及性能對(duì)比,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C#實(shí)現(xiàn)順序棧和鏈棧的代碼實(shí)例

    C#實(shí)現(xiàn)順序棧和鏈棧的代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于的C#實(shí)現(xiàn)順序棧和鏈棧的代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#操作word的方法示例

    C#操作word的方法示例

    這篇文章主要介紹了C#操作word的方法,結(jié)合實(shí)例形式分析了C#針對(duì)word文檔的讀取、寫入、保存等相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • Winform實(shí)現(xiàn)抓取web頁面內(nèi)容的方法

    Winform實(shí)現(xiàn)抓取web頁面內(nèi)容的方法

    這篇文章主要介紹了Winform實(shí)現(xiàn)抓取web頁面內(nèi)容的方法,代碼只有短短幾行,但是功能很實(shí)用,需要的朋友可以參考下
    2014-09-09
  • C#并行編程之Task同步機(jī)制

    C#并行編程之Task同步機(jī)制

    這篇文章介紹了C#并行編程之Task同步機(jī)制,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中

    C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中

    這篇文章主要給大家介紹C#.net中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中,本文涉及到C#.net中批量插入數(shù)據(jù)到數(shù)據(jù)庫中方面的內(nèi)容,對(duì)C#.net批量插入數(shù)據(jù)到數(shù)據(jù)庫中感興趣的朋友可以參考下本篇文章
    2015-10-10
  • C#利用Label標(biāo)簽控件模擬窗體標(biāo)題的移動(dòng)及窗體顏色不斷變換效果

    C#利用Label標(biāo)簽控件模擬窗體標(biāo)題的移動(dòng)及窗體顏色不斷變換效果

    Label標(biāo)簽控件相信對(duì)大家來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于C#利用Label標(biāo)簽控件模擬窗體標(biāo)題的移動(dòng)及窗體顏色不斷變換效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12

最新評(píng)論