プロパティと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プロパティをイベント経由で変更することになったとします*1。delegateは次のように定義されています。
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プロパティじゃ例が悪いですよね・・・