Latest web development tutorials

C#のリフレクション(反射)

反射手段は、プログラム、自分の状態や動作を検出し、修正する能力にアクセスすることができます。

アセンブリは、順番にメンバーが含まれているタイプを含むモジュールを、含まれています。 反射は、オブジェクトパッケージアセンブリ、モジュール、およびタイプを提供します。

あなたはタイプが既存のオブジェクトにバインドされ、動的型のインスタンスを作成するためにリフレクションを使用するか、または既存のオブジェクトから型を取得することができます。 その後、アプローチの種類を呼び出すか、そのフィールドやプロパティにアクセスすることができます。

賛否両論

利点:

  • 1、改善されたプロセスの柔軟性と拡張性を反映しています。
  • 2、適応能力を向上させる、結合を低減。
  • プログラムは、従来のハードコードされたターゲットクラスなしに、任意のタイプのオブジェクトを作成し、制御することを可能にする3。

短所:

  • 1、パフォーマンスの問題:使用は、本質的に直接コードに比べへのアクセスのためのフィールドとメソッドは、はるかに遅い動作を説明する反射、です。 このように、メインアプリケーションの柔軟性とスケーラビリティ厳しい枠組みでの反射は、一般的な手順は推奨されません。
  • 2、プログラムロジック内のファジー反射の使用、プログラマがソースコードのロジックを参照したいのですが、反射が直接対応するコードよりも複雑な保守の問題をもたらすでしょう、ソースコード技術、及び反射コードをバイパス。

反射(リフレクション)の用途

以下の目的のためにリフレックス(リフレクション):

  • それはあなたがランタイム(属性)情報でプロパティを表示することができます。
  • これは、様々なタイプのコレクション、ならびにこれらのタイプの例を検討することができます。
  • これは、メソッドとプロパティ(プロパティ)の遅延バインディングできます。
  • これは、実行時に新しい型を作成することができ、その後、これらの型を使用すると、いくつかのタスクを実行します。

ビューのメタデータ

我々はすでに、上記のセクションで言及した反射(リフレクション)を使用するには、プロパティ(属性)情報を表示することができます。

オブジェクトする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
備考: