プロパティとGetter/Setter

C#ではプロパティがサポートされているため、次のようなコードを書くことはほとんどありません。

class Person {
  string name;

  public string GetName() {
    return name;
  }

  public void SetName(string nm) {
    name = nm;
  }
}

こんなの見たら、即座にプロパティにしてしまいそうです。(^^;

class Person {
  string name;

  public string Name {
    get { return name; }
    set { name = value; }
  }
}

Getter/SetterをNameプロパティに書き換えてスッキリしたところで、急きょ、このNameプロパティをイベント経由で変更することになったとします*1delegateは次のように定義されています。

delegate void Setter(string val);
delegate string Getter();

しかし、Nameはプロパティなので、

xxx.Set += new Setter(person.Name);

こんなことは出来ません。じゃ、イベントにコールバックして貰うためのメソッドを用意して・・・とかすると、最初のGetter/Setterで良かったというオチになります。なにがなんでもプロパティを使いたいなら、

class Property {
  object obj;
  PropertyInfo pi;
  
  public Property(object o, string name) {
    obj = o;
    pi = o.GetType().GetProperty(name);
  }

  public string Get() {
    return (string)pi.GetValue(obj, null);
  }

  public void Set(string val) {
    pi.SetValue(obj, val, null);
  }
}

こんなラッパークラスこさえて、

Person person = new Person();
Property p = new Property(person, "Name");
xxx.Set += new Setter(p.Set);
xxx.Get += new Getter(p.Get);

こうやるとか。でも、やっぱまどろっこしいです。プロパティとGettter/Setterの違いで困ることはほとんどありませんが、レアケースとしてあげてみました。

*1:Nameプロパティじゃ例が悪いですよね・・・