Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9278

C#の属性(Attribute)の実態が作られるタイミング

$
0
0

TL;DR;

GetAttributeで見つかったタイミング。
ちなみにキャッシュはされない。

属性(Attribute)とは

C#…といか.NETは強力なメタプログラミングが可能な言語(フレームワーク)です。
各クラスやメソッドなどにリフレクション情報が含まれていて、この情報から、メソッドの名前や属するクラス、継承関係などを取得することができます。
また、そのリフレクション情報を拡張するための機能としてカスタム属性という機能があります。
例えばHogeAttributeというAttributeを継承したクラスを定義し、これを付与したいクラスやメソッドなどの直前に[Hoge()]と付加します。括弧の中に引数を渡すこともできます。

カスタム属性の取得方法

Attribute[]attrs=typeof(TargetClass).GetCustomAttributes(true);HogeAttributehoge=attrs.FirstOrDefault(a=>aisHogeAttribute);// またはHogeAttributehoge=Attribute.GetAttribute(typeof(TargetClass),typeof(HogeAttribute))asHogeAttribute;

ジェネリックに対応していないので、T GetAttribute<T>(this Type t) : where T : Attributeみたいな拡張クラスを用意して使うことが多いかと思います。

確認

classTestAttribute:Attribute{publicTestAttribute(stringmsg){Console.WriteLine($"\tCREATED ATTRIBUTE INSTANCE {msg}");}}[Test("INSTANCE")]classInstanceClass{publicInstanceClass(){}}[Test("STATIC")]staticclassStaticClass{publicstaticvoidMethod(){}}classProgram{staticvoidMain(string[]args){Console.WriteLine("InstanceClass new");newInstanceClass();Console.WriteLine("StaticClass Call");StaticClass.Method();Console.WriteLine("InstanceClass TypeInfo");varc=typeof(InstanceClass);Console.WriteLine("StaticClass TypeInfo");vars=typeof(StaticClass);Console.WriteLine("InstanceClass GetAttribute");c.GetCustomAttributes(true);Console.WriteLine("StaticClass GetAttribbute");s.GetCustomAttributes(true);Console.WriteLine("InstanceClass GetAttribute 2");c.GetCustomAttributes(true);Console.WriteLine("StaticClass GetAttribbute 2");s.GetCustomAttributes(true);}}
Output
InstanceClass new
StaticClass Call
InstanceClass TypeInfo
StaticClass TypeInfo
InstanceClass GetAttribute
    CREATED ATTRIBUTE INSTANCE INSTANCE
StaticClass GetAttribbute
    CREATED ATTRIBUTE INSTANCE STATIC
InstanceClass GetAttribute 2
    CREATED ATTRIBUTE INSTANCE INSTANCE
StaticClass GetAttribbute 2
    CREATED ATTRIBUTE INSTANCE STATIC

GetCustomAttributesの時点でTestAttributeのコンストラクタが呼ばれていることがわかります。
また、二回目のGetCustomAttributesの後にもコンストラクタがよばれていることが確認できました。


Viewing all articles
Browse latest Browse all 9278

Trending Articles