リフレクションでリスト操作


C# でリフレクションを用いたリストを操作の覚書です。次のようなコードをリフレクションに置き換えてみます。

var list = new List<string>();
list.Add("Hello World");
var item = list[0];

まずはもっとも原始的な書き方です。 dynamic を使わずに書いてみます。

Type itemType = typeof(string);
Type listType = typeof(List<>).MakeGenericType(itemType);
MethodInfo add = listType.GetMethod("Add", new Type[] { itemType });
PropertyInfo indexer = listType.GetProperty("Item");

object list = Activator.CreateInstance(listType);
add.Invoke(list, new object[] { "Hello World" });
object item = indexer.GetValue(list, new object[] { 0 });

dynamic がない場合は取得した要素も object になるので,ここから string としての操作を行う (たとえば Length を取得する) にはさらに MemberInfo を作っていかなければなりません。

dynamic を導入すると以下のようになります。

Type itemType = typeof(string);
Type listType = typeof(List<>).MakeGenericType(itemType);

dynamic list = Activator.CreateInstance(listType);
list.Add("Hello World");
dynamic item = list[0];

dynamic を用いると,コードがすっきりしますね。最後も dynamic で受けることができるので,次の操作も軽く記述することができます。さらに,特に何度も操作を場合にはパフォーマンスも上がります[A]

脚注

  1. もちろんリフレクションを行わない通常の操作に比べたら遅いですが。 []