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]。
脚注
- もちろんリフレクションを行わない通常の操作に比べたら遅いですが。 [↩]