C#におけるリフレクションの応用

リフレクションとは、プログラムが自身の状態や動作にアクセスし、検査し、変更できる能力を指します。アセンブリにはモジュールがあり、モジュールには型(クラス、構造体など)が含まれています。リフレクションはこれらの要素をカプセル化し、操作するための手段を提供します。
リフレクションの利点:
  • 柔軟性と拡張性を向上させる。
  • 結合度を下げ、適応力を高める。
  • 事前にターゲットクラスをハードコーディングしなくても、任意のクラスオブジェクトを作成・操作できる。
リフレクションのデメリット:
  • パフォーマンス問題:リフレクションを使用すると、フィールドやメソッドへのアクセスが直接コードよりも遅くなる。
  • 内部ロジックが不明瞭になり、メンテナンスが困難になる。
リフレクションの用途:
  • 実行時に属性情報を確認する。
  • コレクション内のさまざまな型を調査し、インスタンス化する。
  • 遅延バインドされたメソッドやプロパティを使用する。
  • 実行時に新しい型を作成し、特定のタスクを実行する。

メタデータの表示

リフレクションを使って属性情報を確認できます。
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);
    }
}

タグ: C# リフレクション System.Reflection Assembly type

7月23日 20:36 投稿