C# でのリフレクション

PHPz
PHPzオリジナル
2024-09-03 15:19:12937ブラウズ

C# におけるリフレクションは、その機能に関する情報を収集し、それ自体を操作するプロセスです。収集する情報には、オブジェクトのプロパティ、タイプ、イベント、メソッドが含まれます。リフレクションは、あらゆる種類のアセンブリを検索するのに役立ちます。これは、既存のオブジェクトに動的にバインドしたり、既存のオブジェクトから型を取得したりできるアセンブリ メソッドを動的に呼び出します。リフレクションは、型のインスタンスを作成するために使用されます。リフレクションの主な目的は、実行時にアセンブリを検索するためにメタデータを読み取るために使用されるプロパティとフィールドにアクセスできます。

C# でリフレクションが必要なのはなぜですか?

実行時に型情報を取得するには、C# でのリフレクションが必要です。これは、マネージド コードを観察してそのメタデータを読み取り、実行時にモジュールやアセンブリを見つけるプロセスです。リフレクションは、アセンブリからメタデータを抽出することによってプログラムに反映され、その動作を変更するために使用されます。  システム。 Reflection 名前空間を使用すると、メソッド、読み込まれた型、およびフィールドのマネージド ビューにアクセスして、型を動的に作成して呼び出すことができます。以下の申請手続きに反映が必要となります

  • 実行時プロセス中に、リフレクションにより属性情報を表示できます。
  • リフレクションにより、プロパティとメソッドへの遅延バインディングが可能
  • いくつかの種類のアセンブリとそのタイプを調べます
  • 実行時に新しい型を作成でき、それらの型に従ってさまざまなタスクを実行できます。

C# ではリフレクションはどのように機能しますか?

C# Reflection を使用すると、アプリケーション自体が情報を取得し、アプリケーション自体を操作できるようになります。あらゆる種類のアセンブリを効果的に検索し、アセンブリ メソッドを動的に呼び出します。

リフレクションで使用される主な重要なクラスは System です。型クラスは、CTS(Common Type System)と呼ばれる型を表す抽象クラスです。このクラスを使用すると、名前空間モジュールで使用した型を見つけて、指定された型が値型または参照型であることを確認できます。次の項目を使用すると、メタデータ テーブルを解析できます。

  • メソッド
  • プロパティ
  • イベント
  • フィールド

リフレクションを使用すると、Late Binding が実現されます。コンパイル時には、次の理由により、どのアセンブリをロードすればよいかわからない場合があります。実行時にアセンブリ名と種類を入力するようにユーザーに要求することで、適切なアセンブリを読み込みます。アセンブリに直接ロードすることで、システムを使用します。反射。 3 つの静的型を取得してアセンブリするには、

  • ロード元
  • ロードモジュール
  • LoadWithPartialName

アセンブリが exe または dll ファイルであることを考慮すると、そのファイルは .dll または .exe の拡張子を持つ Common Type System 用のポータブル実行可能ファイルになります。ポータブルな実行可能ファイルは、次のような複数のテーブルを含むメタデータです。

  • メソッド定義テーブル
  • タイプ定義テーブル
  • フィールド定義テーブル

C# でのリフレクションの例

以下は C# でのリフレクションの例です:

例 #1

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 のリフレクションを関連付けて、名前空間、名前、フルネーム、ベースタイプなどの文字列クラスの情報を取得します。

出力:

C# でのリフレクション

例 #2

このプログラムでは、typeofメソッドを定義することでアセンブリを取得し、_typeという方法で処理しています。組み立て。サンプルプログラムを見てみましょう

using System;
using System.Reflection;
public class ReflectionExample
{
public static void Main()
{
Type _type = typeof(System.String);
Console.WriteLine(_type.Assembly);
}
}

出力:

C# でのリフレクション

例 #3

このプログラムでは、リフレクションを使用してメタデータを表示します。これには、メソッド、クラス、およびさまざまなパラメーター化されたコンストラクターが含まれます。以下の例を見てみましょう。

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);
}
}
}
}
}
}

出力:

C# でのリフレクション

例 #4

リフレクションは、実際の構造と動作を観察し、動的に変更するプロセスです。以下のサンプル プログラムでは、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# でのリフレクション

結論

記事をお楽しみいただけたでしょうか。 C# Reflection では、.Net の重要な機能について説明します。いくつかの例を使用して、C#.Net でリフレクションがどのように機能するかを学びました。この記事があなたの理解の一助になれば幸いです。

以上がC# でのリフレクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:C# パラメータ次の記事:C# パラメータ