最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、屬性

屬性Attributes在C#中很常用,但事實上很多人對這個東西又很陌生。

從概念上講,屬性提供的是將元數據關系到元素的一種方式。

屬性使用的樣子,應該都見過:

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

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

通常,屬性會放在類、字段、方法等定義的上面,用來指定特定的內容。

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

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

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

二、自定義屬性

自定義屬性用處很大,算是我自己比較常用的一個技術。

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

想象一個場景。我們在構建一個手機類。我們需要一個屬性來表示手機一些信息,比方口牌和生產年份:

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

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

我們會注意到:屬性是一個類,和其它類一樣,擁有字段、方法、構造函數和其它成員。

三、使用屬性

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

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

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

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

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

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

四、限制屬性

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

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

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

AttributeTargets是一個枚舉,有很多選項,包括類、接口、方法、構造函數、枚舉、程序集等。

上邊的代碼,我們限定了屬性只用于指定和修飾類和接口。所以,如果用這個屬性來修飾一個字段,編譯器會報錯。

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

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

以及該屬性是否可以在一個元素上有多個實例:

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

五、訪問屬性

有了屬性,怎么訪問呢?

框架提供了一個方法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}");

六、反射訪問

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

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

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

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

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

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

關于反射的內容,不展開討論。

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

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)

同樣,還可能通過反射獲得關于已定義的屬性的信息,以及關于對象的構造函數的信息:

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)建實例

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

來看看這個方法的使用:

ReflectedClass newReflected = new ReflectedClass();

var reflectedType = newReflected.GetType();

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

八、使用反射處理泛型

使用反射處理泛型會比處理普通類型麻煩一點。

這里需要知道,Type類上有一個屬性用來標識類型是不是泛型:

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

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

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());

有一點復雜,但可以實現(xiàn)。

九、總結

寫得好像有點亂。

總結一下,屬性將元數據分配給元素,包括類、字段、方法等等。該元數據在構建項目時被編譯,并描述元素,而不是元素的數據。

可以創(chuàng)建從Attribute類繼承的自定義屬性。可以使用AttributeUsage屬性來限制這些屬性的使用位置,并且可以使用反射來獲取屬性數據。

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

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

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

相關文章

  • 基于C#實現(xiàn)的多邊形沖突檢測實例

    基于C#實現(xiàn)的多邊形沖突檢測實例

    這篇文章主要給大家介紹了基于C#實現(xiàn)的多邊形沖突檢測的相關資料,文中介紹的方法并未使用第三方類庫,可以完美解決這個問題,需要的朋友可以參考下
    2021-07-07
  • .Net(c#)漢字和Unicode編碼互相轉換實例

    .Net(c#)漢字和Unicode編碼互相轉換實例

    下面小編就為大家?guī)硪黄?Net(c#)漢字和Unicode編碼互相轉換實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • C#實現(xiàn)的文件操作封裝類完整實例【刪除,移動,復制,重命名】

    C#實現(xiàn)的文件操作封裝類完整實例【刪除,移動,復制,重命名】

    這篇文章主要介紹了C#實現(xiàn)的文件操作封裝類,結合完整實例形式分析了C#封裝文件的刪除,移動,復制,重命名等操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • C#結合Minio實現(xiàn)文件上傳存儲與更新

    C#結合Minio實現(xiàn)文件上傳存儲與更新

    MinIO是一個開源的對象存儲服務器,專門設計用于在大規(guī)模數據存儲環(huán)境中運行,這篇文章主要為大家介紹了C#如何結合Minio實現(xiàn)文件上傳存儲與更新,需要的可以參考下
    2024-03-03
  • 用C#的params關鍵字實現(xiàn)方法形參個數可變示例

    用C#的params關鍵字實現(xiàn)方法形參個數可變示例

    params關鍵字以實現(xiàn)方法形參個數可變是C#語法的一大優(yōu)點,下面是用C#中的params關鍵字實現(xiàn)方法形參個數可變
    2014-09-09
  • c#中WinForm用OpencvSharp實現(xiàn)ROI區(qū)域提取的示例

    c#中WinForm用OpencvSharp實現(xiàn)ROI區(qū)域提取的示例

    已經自學OpencvSharp一段時間了,現(xiàn)在就分享一下我的學習過程,本文主要介紹了c#中WinForm用OpencvSharp實現(xiàn)ROI區(qū)域提取的示例,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • 解讀C#中ReadString的一些小疑惑

    解讀C#中ReadString的一些小疑惑

    這篇文章主要介紹了關于C#中ReadString的一些小疑惑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#利用接口實現(xiàn)多語種選擇功能

    C#利用接口實現(xiàn)多語種選擇功能

    這篇文章主要為大家詳細介紹了如何C#利用接口實現(xiàn)多語種選擇功能,即多語言切換的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2024-02-02
  • 3種C# 加載Word的方法

    3種C# 加載Word的方法

    本次經驗內容分享通過C#程序來加載Word文檔的3種不同方法。分別是:加載本地Word文檔、以只讀模式加載Word文檔、從流加載Word 想具體了解的小伙伴請參考下文
    2021-09-09
  • 基于C#實現(xiàn)自定義計算的Excel數據透視表

    基于C#實現(xiàn)自定義計算的Excel數據透視表

    數據透視表(Pivot?Table)是一種數據分析工具,通常用于對大量數據進行匯總、分析和展示,本文主要介紹了C#實現(xiàn)自定義計算的Excel數據透視表的相關知識,感興趣的可以了解下
    2023-12-12

最新評論

池州市| 镇安县| 红原县| 工布江达县| 乌恰县| 宾阳县| 曲阜市| 曲阜市| 芮城县| 剑阁县| 聊城市| 互助| 广南县| 衡山县| 航空| 镇坪县| 汪清县| 台北县| 德兴市| 新平| 屏山县| 柳林县| 北辰区| 星子县| 区。| 禹城市| 民权县| 西安市| 来凤县| 石棉县| 芜湖市| 新密市| 江安县| 霍山县| 安徽省| 上栗县| 朝阳区| 斗六市| 邵东县| 科技| 阿图什市|