< DoEvents | 環状キュークラス >

March 13, 2009

プロパティのデリゲート

プロパティのデリゲート欲しい人ー !! みんな欲しくないのー !? 欲しいよねー !?

主に 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

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?