プロパティのデリゲート
プロパティのデリゲート欲しい人ー !! みんな欲しくないのー !? 欲しいよねー !?
主に GUI にかかわるプロパティを別スレッドから操作したい場合だと思うんだけど、プロパティ更新するだけのメソッドを用意したりして、なんだかなぁと。試しに以下のように Person クラスを作って、そのメンバを調べてみた。
namespace TestProgram { class Person { public string Name { get; set; } public int Age { get; set; } public void SayHallo (Person you) { // 君に挨拶するよ ! Console.WriteLine (string.Format ("Hello ! {0}, I am {1};", you.Name, this.Name)); } } class Test { static void Main (string [] args) { var personType = typeof (Person); foreach (var member in personType.GetMembers ()) { Console.WriteLine (string.Format ("{0,-12} {1,-24} {2,-12}", member.Name, member.DeclaringType, member.MemberType)); } } } }
実行結果はこんな感じ。へっへ、欲しいもん、ありましたぜダンナ。
get_Name TestProgram.Person Method set_Name TestProgram.Person Method get_Age TestProgram.Person Method set_Age TestProgram.Person Method SayHallo TestProgram.Person Method ToString System.Object Method Equals System.Object Method GetHashCode System.Object Method GetType System.Object Method .ctor TestProgram.Person Constructor Name TestProgram.Person Property Age TestProgram.Person Property 続行するには何かキーを押してください . . .
さらに、メソッドの宣言を取得してみた。
static void Main (string [] args) { var personType = typeof (Person); foreach (var member in personType.GetMembers ()) { //Console.WriteLine (string.Format ("{0,-12} {1,-24} {2,-12}", member.Name, member.DeclaringType, member.MemberType)); if (member.MemberType == System.Reflection.MemberTypes.Method) { var method = personType.GetMethod (member.Name); if (method != null) Console.WriteLine (string.Format ("{0}", method.GetBaseDefinition ())); } } }
実行結果。
System.String get_Name() Void set_Name(System.String) Int32 get_Age() Void set_Age(Int32) Void SayHallo(TestProgram.Person) System.String ToString() Boolean Equals(System.Object) Int32 GetHashCode() System.Type GetType() 続行するには何かキーを押してください . . .
なので、プロパティの型と名称が分かれば、こんな拡張メソッドでプロパティのデリゲートが作成できますね。
public static class DelegateExtention { public static Action<TValue> CreatePropertySetDelegate<TValue> (this object obj, string propertyName) { return Delegate.CreateDelegate (typeof (Action<TValue>), obj, "set_" + propertyName) as Action<TValue>; } public static Func<TValue> CreatePropertyGetDelegate<TValue> (this object obj, string propertyName) { return Delegate.CreateDelegate (typeof (Func<TValue>), obj, "get_" + propertyName) as Func<TValue>; } }
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2345
コメント
こんばんわ
タイムリー。匿名メソッドって手があった。
http://blogs.wankuma.com/rti/archive/2009/03/13/169640.aspx