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バンザイ!