【C#4.0】ラッパークラスDynamicObjectで遊んでみる。
- 2011.05.10 Tuesday
- 23:01
Source and Project
MSDNライブラリーのDynamicObjectの紹介でラッパークラスの実装が紹介されていたので
それを参考に自分で実装してみた。
動的にプロパティを定義できるオブジェクトを生成するクラス。
public class NamedDynamicObject : DynamicObject
{
public static dynamic Create()
{
return new NamedDynamicObject();
}
protected NamedDynamicObject()
{
_setting = new Dictionary<string, object>();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _setting.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_setting[binder.Name] = value;
return true;
}
private readonly Dictionary<string, object> _setting;
}
このオブジェクトをdynamicで受けることにより
クラスで定義されていないメンバーへアクセスしているようなコードが記述出来る。
使用例は
class Program
{
static void Main(string[] args)
{
dynamic top = NamedDynamicObject.Create();
top.Value = 1;
top.Next = NamedDynamicObject.Create();
top.Next.Value = 2;
top.Next.Next = NamedDynamicObject.Create();
top.Next.Next.Value = 3;
top.Next.Next.Next = top;
top.Print = new Action<dynamic>(PrintList);
top.Print(top);
}
static void PrintList(dynamic top)
{
dynamic current = top;
for (int i = 0; i < 10; i++)
{
Console.WriteLine(current.Value);
current = current.Next;
}
}
}
特に意味のあるコードではないが、NamedDynamicObjectクラスで定義されていないメンバーに
アクセスして値やインスタンスが設定されている。
デリゲートを利用して、メンバー経由でデリゲートを実行してみた。
(TryInvokeMemberメソッドを利用すればメソッドのオーバーロードも実現できそう)
オブジェクトにたいして全て外部から定義をしてオブジェクトを操作する。
なんだかともて不思議な感じです。
Source and Project