リフレクションとは、プログラムが自身の状態や動作にアクセスし、検査し、変更できる能力を指します。アセンブリにはモジュールがあり、モジュールには型(クラス、構造体など)が含まれています。リフレクションはこれらの要素をカプセル化し、操作するための手段を提供します。
リフレクションの利点:
System.Reflection 名前空間の MemberInfo オブジェクトを初期化し、対象クラスの属性を発見します。例えば:
- 柔軟性と拡張性を向上させる。
- 結合度を下げ、適応力を高める。
- 事前にターゲットクラスをハードコーディングしなくても、任意のクラスオブジェクトを作成・操作できる。
- パフォーマンス問題:リフレクションを使用すると、フィールドやメソッドへのアクセスが直接コードよりも遅くなる。
- 内部ロジックが不明瞭になり、メンテナンスが困難になる。
- 実行時に属性情報を確認する。
- コレクション内のさまざまな型を調査し、インスタンス化する。
- 遅延バインドされたメソッドやプロパティを使用する。
- 実行時に新しい型を作成し、特定のタスクを実行する。
メタデータの表示
リフレクションを使って属性情報を確認できます。System.Reflection 名前空間の MemberInfo オブジェクトを初期化し、対象クラスの属性を発見します。例えば:
using System;
using System.Reflection;
public class SampleClass {
public string Name { get; set; }
}
class Program {
static void Main() {
Type t = typeof(SampleClass);
foreach (var member in t.GetMembers()) {
Console.WriteLine($"{member.MemberType}: {member.Name}");
}
}
}
動的なオブジェクト生成とメソッド呼び出し
リフレクションを使用して、指定した引数でコンストラクターを呼び出す例です:
public class NewInstance {
public NewInstance(string name, string info) {
Console.WriteLine($"Name: {name}, Info: {info}");
}
}
class Program {
static void Main() {
Type t = typeof(NewInstance);
Type[] paramTypes = new Type[] { typeof(string), typeof(string) };
ConstructorInfo ci = t.GetConstructor(paramTypes);
object[] args = new object[] { "Example", "example.com" };
object instance = ci.Invoke(args);
MethodInfo mi = t.GetMethod("Show");
if (mi != null) {
mi.Invoke(instance, null);
}
}
}
Assemblyクラスによるプログラム集の操作
Assemblyクラスはプログラム集に関する情報を取得したり、動的にプログラム集を読み込んだりすることができます。
using System.Reflection;
class Program {
static void Main() {
Assembly assembly = Assembly.LoadFrom("MyLibrary.dll");
Type type = assembly.GetType("MyLibrary.MyClass");
object obj = Activator.CreateInstance(type, "param1", "param2");
MethodInfo method = type.GetMethod("DoSomething");
method.Invoke(obj, null);
}
}
7月23日 20:36 投稿