もっと詳しく
名前が示すように、反射は何かについての情報イメージを与えるものです。 C#内では、リフレクションは「システム」ライブラリにあるよく知られた名前空間であり、クラス、メソッド、パラメーター、またはタイプに関するメタデータを表示します。 コードの側面に関するさまざまな情報を取得するための多くのクラスと属性が含まれています。 そこで、リフレクション名前空間とその属性の使用について詳しく説明するために、いくつかの非常に簡単な例を実行することにしました。 C#ファイルの作成を始めましょう。

例01:

最初の例から始めて、さまざまなタイプ、メソッド、またはフィールドに関するメタデータ情報を見つけるための「System.Reflection」クラスの使用の詳細を見ていきます。 そのため、このコードはSystemライブラリを使用して開始し、その後、コードで「System.Reflection」クラスを使用しました。 名前空間テストとその中のクラステストを開始しました。

このクラスTestには、このコードのドライバー関数となる単一の関数「Main()」が含まれています。 main()関数は、キーワード「Type」で開始され、Systemクラスの「typeof()」関数を介して文字列のタイプ「t1」をロードします。 「タイプ」はReflectionクラスから生まれました。 現在、同じ手順を使用して、それぞれ整数と文字のt2とt3のタイプをロードしています。 Reflectionクラスは、タイプ、メソッド、およびフィールドに関する情報を見つけるために、多くのメタデータ属性を考え出したことを知っています。

したがって、ここではこれらのメタデータ属性を使用して、タイプt1、t2、およびt3に関する情報を検索します。 したがって、3つのConsole.WriteLine()関数ステートメントを使用して、タイプt1、t2、およびt3のName、FullName、Namespace、およびBaseTypeを個別に表示しました。 このために、ここのコードでは、リフレクションクラスの「Name」、「FullName」、「Namespace」、および「BaseType」属性を利用しています。

この新しく作成された「reflection.cs」ファイルを、Linuxシステムにすでに組み込まれているC#コンパイラ「mcs」を使用してコンパイルしています。 このコードの「exe」ファイルが生成され、「mono」ランタイムコマンドでコンパイルされたコードを実行するために使用されました。 画面に表示される出力には、ロードされたタイプの文字列、整数、および文字のName、FullName、Namespace、およびBaseTypeの情報が表示されます。

例#02:

最初の例では、Reflectionクラス属性を使用してType in C#メタデータに関する情報を取得しました。 Reflectionクラスを使用して、ロードされた「アセンブリ」に関するメタデータ情報を取得します。 そのため、最初の行で「System」ライブラリを使用し、2番目の行で「System.Reflection」クラスを使用して例を開始しました。

このコードには、同じ名前クラスTestの名前空間Testが含まれています。 このクラスTestでは、Main()ドライバー関数を使用してシステムの実行を開始しました。 main()関数内では、実行はアセンブリ「t」のロードから始まります。 このロードされたアセンブリ変数「t」は、C#の「int」アセンブリに関するメタデータ情報を、「int」に続いてドットと「Assembly」キーワードを使用する「typeof」関数を介して取得します。 次の正確な行には、アセンブリ「t」に関するメタデータ情報を表示するConsole.WriteLine()関数があります。 ここでクラスと名前空間が完成し、コードが保存されて使用できるようになります。

この新しく作成されたC#コードを「mcs」コンパイラでコンパイルし、Ubuntu 20.04のC#用の「mono」ランタイムエグゼキュータで実行しました。 「t」アセンブリのライブラリの名前を「mscorlib」として表示し、そのバージョン、カルチャ、および公開鍵トークンを下の画面に表示しました。

例#03:

最後の例では、Reflectionクラスを介してコードで使用されるすべてのクラス、メソッド、属性、またはパラメーターのメタデータ情報を確認します。 そのため、上記の2つの例で使用したのと同じコードパターン、つまりSystemライブラリと「System.Reflection」クラスを使用してこのコードを開始しました。 2つのクラス、つまりInfoとTestを保持する名前空間「New」が作成されました。

最初に「Info」クラスについて説明しましょう。 このクラス内では、このコードで使用する必要のあるプロパティまたは変数、つまり、int型のAgeと文字列型のNameの定義を使用しています。 「get」属性と「set」属性は、両方の値の値を取得し、それらをそれぞれ変数AgeとNameに割り当てるために使用されます。 Infoクラスの2つのコンストラクター関数を次に示します。 最初のコンストラクターにはパラメーターがありませんが、もう1つは、新しい変数「a」と「n」の値を取得するパラメーター化されたコンストラクターです。 単純なコンストラクターは、変数AgeとNameの値をそれぞれ25と「Empty」に初期化します。

一方、他のコンストラクターは、確率変数値をAge変数とName変数に割り当てています。つまり、空です。 ここでは、ユーザー定義の「show()」関数を使用して、システムライブラリのConsoleクラスのWriteLine()関数を使用してUbuntu20.04のコンソールに変数「Age」と「Name」の値を表示しています。 ここでファーストクラスが終了しました。

コードに関するメタデータ情報を取得するために「Reflection」属性を利用している「Test」クラスについて説明しましょう。 したがって、このコードのエグゼキュータであるmain()メソッドが含まれています。 ‘GetExecutingAssembly’関数を使用して、現在実行中のアセンブリを取得するために、クラスアセンブリ「Asb」のオブジェクトをロードしました。 このオブジェクト「Asb」は、「GetTypes()」関数を呼び出して、型配列「t」内にアセンブリ型情報を格納するために使用されています。

次に、アセンブリから各タイプを繰り返し、そのメタデータに関する情報を取得します。 したがって、最初の「foreach」ループ内で、Type配列「t」を介してコードで使用される型、つまりクラスを反復処理しています。 使用されるクラスの合計の名前は、Reflectionクラスの「Name」属性によって表示されます。 MethodInfoタイプの配列「Met」は、イテレータ「I」を使用して特定のクラスの合計メソッドを取得するように初期化されています。 内部の「foreach」ループは、Name属性を介して特定のクラス内の各メソッドの名前を表示するために使用されます。

ParameterInfoタイプの配列「Par」は、「GetParameters()」関数を使用して特定のクラスのすべてのメソッドのパラメーター情報を取得するように定義されています。 最後の内部ループは、「Par」配列にあるすべてのパラメーター「p」を反復処理して、ReflectionクラスのName属性とParameterType属性を使用してシェルでパラメーター名とParameterTypeを表示するために使用されます。 これでコードが完成し、コンパイルの準備が整いました。

「Info」クラスと「Test」クラスに関するメタデータ情報は別々に表示されます。 クラスにはパラメータint型のメソッドがあります。 文字列タイプのメソッド。 およびオブジェクトタイプメソッド

結論:

これは、Reflection名前空間クラスを利用して、メソッド、タイプ、パラメーター、アセンブリ、およびクラスに関するメタデータ情報を取得する方法です。 最初の2つの例では、リフレクションクラスのName、FullName、Namespace、BaseType属性を使用して、ロードされたタイプとアセンブリ(int、char、string)に関する情報を取得する方法について説明しました。 最後の例では、GetTypes、GetMethods()、GetParameters、およびReflectionクラスのnameとParameter type属性を使用して、コード全体に関するメタデータを取得しました。

The post C#リフレクション appeared first on Gamingsym Japan.