ホームページ >バックエンド開発 >C#.Net チュートリアル >C# でのリフレクション
C# におけるリフレクションは、その機能に関する情報を収集し、それ自体を操作するプロセスです。収集する情報には、オブジェクトのプロパティ、タイプ、イベント、メソッドが含まれます。リフレクションは、あらゆる種類のアセンブリを検索するのに役立ちます。これは、既存のオブジェクトに動的にバインドしたり、既存のオブジェクトから型を取得したりできるアセンブリ メソッドを動的に呼び出します。リフレクションは、型のインスタンスを作成するために使用されます。リフレクションの主な目的は、実行時にアセンブリを検索するためにメタデータを読み取るために使用されるプロパティとフィールドにアクセスできます。
実行時に型情報を取得するには、C# でのリフレクションが必要です。これは、マネージド コードを観察してそのメタデータを読み取り、実行時にモジュールやアセンブリを見つけるプロセスです。リフレクションは、アセンブリからメタデータを抽出することによってプログラムに反映され、その動作を変更するために使用されます。 システム。 Reflection 名前空間を使用すると、メソッド、読み込まれた型、およびフィールドのマネージド ビューにアクセスして、型を動的に作成して呼び出すことができます。以下の申請手続きに反映が必要となります
C# Reflection を使用すると、アプリケーション自体が情報を取得し、アプリケーション自体を操作できるようになります。あらゆる種類のアセンブリを効果的に検索し、アセンブリ メソッドを動的に呼び出します。
リフレクションで使用される主な重要なクラスは System です。型クラスは、CTS(Common Type System)と呼ばれる型を表す抽象クラスです。このクラスを使用すると、名前空間モジュールで使用した型を見つけて、指定された型が値型または参照型であることを確認できます。次の項目を使用すると、メタデータ テーブルを解析できます。
リフレクションを使用すると、Late Binding が実現されます。コンパイル時には、次の理由により、どのアセンブリをロードすればよいかわからない場合があります。実行時にアセンブリ名と種類を入力するようにユーザーに要求することで、適切なアセンブリを読み込みます。アセンブリに直接ロードすることで、システムを使用します。反射。 3 つの静的型を取得してアセンブリするには、
アセンブリが exe または dll ファイルであることを考慮すると、そのファイルは .dll または .exe の拡張子を持つ Common Type System 用のポータブル実行可能ファイルになります。ポータブルな実行可能ファイルは、次のような複数のテーブルを含むメタデータです。
以下は C# でのリフレクションの例です:
using System; using System.Reflection; namespace Reflection_Sample { class Program_1 { // Main Method static void Main(string[] args) { // to initialize _type as typeof string Type _type = typeof(string); // by using the Reflection to find and in any sort of data related to _type Console.WriteLine("Name : {0}", _type.Name); Console.WriteLine("Full Name : {0}", _type.FullName); Console.WriteLine("Namespace : {0}", _type.Namespace); Console.WriteLine("Base Type : {0}", _type.BaseType); } } }
上記のコードでは、typeof メソッドを使用して、タイプ _type を文字列としてロードしました。次に、_type のリフレクションを関連付けて、名前空間、名前、フルネーム、ベースタイプなどの文字列クラスの情報を取得します。
出力:
このプログラムでは、typeofメソッドを定義することでアセンブリを取得し、_typeという方法で処理しています。組み立て。サンプルプログラムを見てみましょう
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type _type = typeof(System.String); Console.WriteLine(_type.Assembly); } }
出力:
このプログラムでは、リフレクションを使用してメタデータを表示します。これには、メソッド、クラス、およびさまざまなパラメーター化されたコンストラクターが含まれます。以下の例を見てみましょう。
using System; using System.Reflection; namespace Sample_ReflectionMetadata { // to define a class StudentDetails class StudentDetails { // defining the Properties public int _RollNo { get; set; } public string _Name { get; set; } // Constructor with no arguments public StudentDetails() { _RollNo = 0; _Name = string.Empty; } // this is a Parameterised Constructor with 2 parameters public StudentDetails(int _Srollno, string _Sname) { _RollNo = _Srollno; _Name = _Sname; } // to invoke method to Display Student Details public void StudentDisplayData() { Console.WriteLine("Roll Number : {0}", _RollNo); Console.WriteLine("Name : {0}", _Name); } } class ReflectionClass { // Main Method static void Main(string[] args) { // to declare Assembly and loading the current assembly Assembly _executing = Assembly.GetExecutingAssembly(); Type[] _types = _executing.GetTypes(); foreach(var item in _types) { Console.WriteLine("Class : {0}", item.Name); // storing the methods in array MethodInfo[] methods = item.GetMethods(); foreach(var method in methods) { // for displaying each method Console.WriteLine("--> Method : {0}", method.Name); // to store the parameters in array ParameterInfo[] parameters = method.GetParameters(); foreach(var arg in parameters) { Console.WriteLine(" Parameter : {0} Type : {1}", arg.Name, arg.ParameterType); } } } } } }
出力:
リフレクションは、実際の構造と動作を観察し、動的に変更するプロセスです。以下のサンプル プログラムでは、Reflection が機能し、実行時にアプリケーション内の情報を分析および変更できます。 例を見てみましょう。
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace ReflectionSample { class Program { private static int value_1= 15, value_2 = 25, value_3 = 30; static void Main(string[] args) { Console.WriteLine("The Values are = " + (value_1 + value_2 + value_3)); Console.WriteLine("Input the Name of variable to be altered:"); string _varName = Console.ReadLine(); Type _type = typeof(Program); FieldInfo _fieldInfo = _type.GetField(_varName, BindingFlags.NonPublic | BindingFlags.Static); if(_fieldInfo != null) { Console.WriteLine("The Latest Value of " + _fieldInfo.Name + " is " + _fieldInfo.GetValue(null) + ". Input NeW Value:"); string newValue = Console.ReadLine(); int newInt; if(int.TryParse(newValue, out newInt)) { _fieldInfo.SetValue(null, newInt); Console.WriteLine(" Final Values are = " + (value_1 + value_2 + value_3)); } Console.ReadKey(); } } } }
ここでは、名前を知ることで実行時に変数の値を変更できます。リフレクションを使用すると、このような種類のメソッドを実現できます。以下の出力を見てみましょう。
出力:
記事をお楽しみいただけたでしょうか。 C# Reflection では、.Net の重要な機能について説明します。いくつかの例を使用して、C#.Net でリフレクションがどのように機能するかを学びました。この記事があなたの理解の一助になれば幸いです。
以上がC# でのリフレクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。