IEnumerableとyield return
あるクラスのプロパティに対して、foreachを使って、キーと値という形でプロパティ名とその値を
取る必要性が生じたので、初めてIEnumerableを使ってみた。
using System; using System.Reflection; using System.Collections; using System.Collections.Generic; public class Entity : System.Collections.IEnumerable { private int id; private string name; private object value; public int Id { get { return id; } set { this.id = value; } } public string Name { get { return name; } set { this.name = value; } } public object Value { get { return value; } set { this.value = value; } } public IEnumerator GetEnumerator() { Type targetType = this.GetType(); PropertyInfo[] propInfos = targetType.GetProperties(); foreach(PropertyInfo propInfo in propInfos) { object value = targetType.InvokeMember( propInfo.Name, BindingFlags.GetProperty, null, this, null); yield return new KeyValuePair<string, object>(propInfo.Name, value); } } }
GetEnumeratorメソッドを実装して、その中でリフレクションを利用して、
yield returnでKeyValuePairのインスタンスを返す。
これで以下のようにしてプロパティにアクセスできる。
Entity entity = new Entity(); entity.Id = 100; entity.Name = "Hoge"; entity.Value = "HogeHoge"; foreach(KeyValuePair<string, object> keyValue in entity) { Console.WriteLine("プロパティ名:{0}, 値:{1}", keyValue.Key, keyValue.Value); }
yield returnを使うとこんなに簡単に実装できる。C#2.0バンザイ!