C#のリフレクションとは?実行時の型情報取得と活用方法を解説
リフレクション(Reflection)とは
リフレクションは、プログラムの実行時に型情報を動的に取得するための仕組みです。実行中のプログラムのメタデータへアクセスするためのクラスは、System.Reflection 名前空間にまとめられています。
これにより、コンパイル時に型が確定していなくても、実行時にアセンブリの中身を調べたり、オブジェクトを操作したりすることが可能になります。
リフレクションの主な用途
- 属性情報の参照: 実行時にクラスやメソッドに付与された属性の情報を取得・表示できます。
- 型の調査とインスタンス化: アセンブリ内に含まれるさまざまな型を検査し、それらのインスタンスを動的に生成できます。
- 遅延バインディング: メソッドやプロパティへのアクセスを実行時に決定できます。
- 新しい型の作成: 実行時に新しい型を作成し、その型を使って処理を実行できます。
コード例
以下は、カスタム属性を定義し、リフレクションを使ってその属性情報を取得するサンプルです。
using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
public readonly string Url;
public string Topic // Topic は名前付きパラメータ {
get {
return topic;
}
set {
topic = value;
}
}
public HelpAttribute(string url) // url は位置指定パラメータ {
this.Url = url;
}
private string topic;
}
[HelpAttribute("Information on the class MyClass")]
class MyClass {
}
namespace AttributeAppl {
class Program {
static void Main(string[] args) {
// MyClass の型情報を取得
System.Reflection.MemberInfo info = typeof(MyClass);
// クラスに付与された属性をすべて取得
object[] attributes = info.GetCustomAttributes(true);
foreach (object attribute in attributes) {
System.Console.WriteLine(attribute);
}
Console.ReadKey();
}
}
}コードの解説
この例では、まず System.Attribute を継承したカスタム属性 HelpAttribute を定義し、MyClass クラスに適用しています。
Main メソッド内では、typeof 演算子によって MyClass の MemberInfo オブジェクトを取得し、GetCustomAttributes(true) メソッドを呼び出すことで、クラスに付与されたすべての属性を実行時に取得しています。最後に、取得した属性情報をコンソールに出力します。
このようにリフレクションを利用すると、コードの構造自体を実行時にプログラムから操作できるようになり、プラグイン機構やシリアライザ、DIコンテナなど、柔軟な設計が求められる場面で幅広く活用されています。
-
C++で点集合の線対称(ラインリフレクション)を判定するアルゴリズム
問題概要2次元平面上にn個の点が与えられます。このとき、y軸に平行な直線で全ての点を鏡映(反射)した結果が、元の点集合と完全に一致するような直線が存在するかどうかを判定します。言い換えれば、ある直線を対称軸として全ての点を反転させたとき、反転後の点の集合が元の集合と同一になるかを確認する問題です。例えば、入力が points = [[1,1],[-1,1]] の場合を考えてみましょう。この場合、x = 0 の直線(y軸)を対称軸とすると、点 (1,1) は (-1,1) へ、(-1,1) は (1,1) へと移ります。点集合全体としては変化がないため、出力は true となります。解法のポイン
-
C++で解くミラーリフレクション(鏡面反射)問題のアルゴリズムと実装
ミラーリフレクション問題とは4つの壁すべてに鏡が張られた正方形の部屋を考えてみましょう。南西の角以外の各角には、0、1、2という番号が付けられたレシーバー(受光器)が設置されています。この正方形の部屋の一辺の長さは p であり、南西の角から発射されたレーザー光線は、最初に東側の壁に当たります。その位置は、0番のレシーバーから距離 q の地点です。このとき、光線が最初に到達するレシーバーの番号を求めるのが本問題です。例えば、p = 2、q = 1 の場合を考えてみます。光線は壁で反射を繰り返し、最終的に左側の壁へ戻ってきたときに初めてレシーバー2に到達します。したがって、出力は 2 となります。