リフレクションを可能にするC#言語の性質とは? それはすべてのオブジェクト指向言語でできることですか、それともすべてのインタープリター言語でできることですか? または、他の何か...
4 に答える
コンパイラは、あなたが書いたプログラムについて多くのことを知っています。あなたがプログラムしたすべてのクラス、メソッドの名前、それらが取る引数を知っています。従来、コンパイラは、プログラムの実行可能コードを生成した後、プログラムに関する余分な情報を破棄していました。
.NET コンパイラではなく、その情報を保持します。これは、アセンブリのメタデータに格納されます。生成されたコード以外の、.NET .exe または .dll ファイル内の追加のデータ構造。実行時にそのデータ構造を読み取るためのランタイム サポート ライブラリの配管により、System.Type クラスは役に立ちます。
これで終わりではなく、そのメタデータに任意の追加データを追加することもできます。それが[属性]のすべてです。
これにより、あらゆる種類の非常に興味深い便利な機能が有効になります。実行時にコードが生成される方法を動的に変更するようなものです。または、クラス名を知らなくてもオブジェクトを動的に作成します。または、型のビューをその実装から、扱いやすい便利な他の表現に変換します。これにより、シリアル化や設計時のサポートなどの機能が有効になります。リフレクションはこの背後にあるエンジンであり、メタデータはソースです。
C# のすべての型/メソッドのメタデータは、リフレクションによってアクセスできます。通常、BindingFlags を使用して、必要なオブジェクトの種類を指定する必要があります。
例:
MethodInfo[] myArrayMethodInfo1 = myType.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
ハンス・パッサントの言葉を要約すると、
コンパイルされたすべての C# プログラムはリレーショナル データベースにエンコードされます。これはメタデータと呼ばれます。リフレクションにより、この特別なデータベースのデータに基づいて行動します。
C#のリフレクションとは何ですか、利点は何ですか。ベネフィットを得るためにそれを使用する方法
これも読んで。
リフレクションとは、言語が自分自身のメタ言語になる能力です。
例えば:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);
クラス、オブジェクト、メソッドに適用できます。
C# はコンパイル済み言語であり、C# コンパイラによって生成されたバイトコードは仮想マシンによって解釈されます。リフレクションは特定のパラダイムに結び付けられているわけではなく、言語がどのように設計されているかに依存します。