C#のリフレクション(反射)2024 年の最新の入門チュートリアル。このコースでは 反射(リフレクション)の用途,ビューのメタデータ,例, について学習できます。
反射手段は、プログラム、自分の状態や動作を検出し、修正する能力にアクセスすることができます。
アセンブリは、順番にメンバーが含まれているタイプを含むモジュールを、含まれています。 反射は、オブジェクトパッケージアセンブリ、モジュール、およびタイプを提供します。
あなたはタイプが既存のオブジェクトにバインドされ、動的型のインスタンスを作成するためにリフレクションを使用するか、または既存のオブジェクトから型を取得することができます。 その後、アプローチの種類を呼び出すか、そのフィールドやプロパティにアクセスすることができます。
利点:
短所:
以下の目的のためにリフレックス(リフレクション):
我々はすでに、上記のセクションで言及した反射(リフレクション)を使用するには、プロパティ(属性)情報を表示することができます。
オブジェクトするSystem.ReflectionのMemberInfoクラスは、クラス(属性)に関連付けられているプロパティを発見するため、初期化する必要があります。次のようにこれを行うには、あなたは、ターゲット・オブジェクト・クラスを定義することができます。
System.Reflection.MemberInfo情報= typeof演算(MyClassの);
次のプログラムは、この点を示しています。
システムを用いました。 【AttributeUsage(AttributeTargets.All)] パブリッククラスHelpAttribute:System.Attribute { 公共の読み取り専用文字列のURL。 公共の文字列のトピック//トピックは、名前付き(名前付き)のパラメータ{です ゲット { トピックを返します。 } セット { トピック=値; } } 公共HelpAttribute(文字列のURL)// urlはポジショニング(位置)パラメータ{です this.Url = URL; } プライベート文字列トピック。 } [HelpAttribute(「MyClassクラスに関する情報 ")] MyClassクラス { } 名前空間AttributeAppl { クラスプログラム { 静的な無効メイン(文字列[] args) { System.Reflection.MemberInfo情報= typeof演算(MyClassの); オブジェクトは、[]属性= info.GetCustomAttributes(真の); 以下のために(int型私= 0;私<attributes.Length; iは++) { System.Console.WriteLine(属性[I])。 } Console.ReadKey()。 } } }
上記のコードをコンパイルして実行されると、それはMyClassクラス上に取り付けられたカスタムプロパティが表示されます。
HelpAttribute
この例では、最後の章で作成したDEBUGINFOプロパティを使用して、Rectangleクラスのメタデータを読み取るためにリフレクション(反射)を使用しています。
システムを用いました。 するSystem.Reflectionを使用しました。 名前空間BugFixApplication { //バグ修正カスタムプロパティは、クラスに割り当てられ、そのメンバー[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property、 AllowMultiple =真)] パブリッククラスDEBUGINFO:System.Attribute { プライベートint型bugNo。 プライベート文字列の開発者。 プライベート文字列lastReview。 公共の文字列メッセージ。 公共DEBUGINFO(int型BG、文字列devの、列D) { this.bugNo = BG; this.developer = devの。 this.lastReview = D; } 公共int型BugNo { ゲット { bugNoを返します。 } } 公共の文字列開発 { ゲット { 開発者を返します。 } } 公共の文字列LastReview { ゲット { lastReviewを返します。 } } 公共の文字列のメッセージ { ゲット { メッセージを返します。 } セット { メッセージ=値; } } } 【DEBUGINFO(45、「ザラアリ "、" 2012年12月8日」、 メッセージ= "戻り値の型の不一致")] 【DEBUGINFO(49、「Nuhaアリ "、" 2012年10月10日」、 メッセージ= "未使用変数")] クラス長方形 { //メンバー変数は、二重の長さを保護します。 保護された二重の幅。 公共長方形(ダブルリットル、二重ワット) { 長さ=リットル; 幅=ワット; } 【DEBUGINFO(55、「ザラアリ」、「19/10/2012」、 メッセージ= "戻り値の型の不一致")] 公共ダブルGETAREA() { 長さ*幅を返します。 } 【DEBUGINFO(56、「ザラアリ "、" 19/10/2012 ")] 公共ボイドディスプレイ() { Console.WriteLineを( "長さ:{0}"、長さ); Console.WriteLineを( "幅:{0}"、幅); Console.WriteLineを( "エリア:{0}"、GETAREA()); } } //エンドクラスの長方形 クラスExecuteRectangle { 静的な無効メイン(文字列[] args) { 矩形R =新しいRectangle(4.5、7.5); r.Display()。 タイプtype = typeof演算(長方形); // Rectangleクラスは、foreachの(type.GetCustomAttributesでのオブジェクトの属性(偽))を属性トラバース { DEBUGINFO DBI =(DEBUGINFO)属性。 (ヌル!= DBI)の場合 { Console.WriteLineを( "バグ番号:{0}"、dbi.BugNo)。 Console.WriteLineを( "開発者:{0}"、dbi.Developer)。 Console.WriteLineを( "最後の投稿:{0}"、 dbi.LastReview); Console.WriteLineを( "備考:{0}"、dbi.Message)。 } } //反復法は、foreachの(type.GetMethodsでMETHODINFO mを())の属性 { foreachの(m.GetCustomAttributesに属性(真)) { DEBUGINFO DBI =(DEBUGINFO)。 (ヌル!= DBI)の場合 { Console.WriteLineを( "バグ番号:{0}、メソッドのために:{1}"、 dbi.BugNo、m.Name)。 Console.WriteLineを( "開発者:{0}"、dbi.Developer)。 Console.WriteLineを( "最後の投稿:{0}"、 dbi.LastReview); Console.WriteLineを( "備考:{0}"、dbi.Message)。 } } } Console.ReadLine(); } } }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
長さ:4.5 幅:7.5 エリア:33.75 バグ番号:49 開発者:Nuhaアリ 最終投稿:2012年10月10日 備考:未使用変数 バグ番号:45 開発者:ザラアリ 最終投稿:2012年12月8日 備考:戻り値の型の不一致 バグ番号:55、方法のため:GETAREA 開発者:ザラアリ 最終投稿:19/10/2012 備考:戻り値の型の不一致 バグ番号:56、方法のため:ディスプレイ 開発者:ザラアリ 最終投稿:19/10/2012 備考: