動機
C#は静的型付け!!
なんだけど、型を定義するのがたまに面倒。
私、javascriptなんかも書くことがありますので、any型に親しみすぎてきつい。
対策
C#に動的型付けを導入する。
方法
DynamicObjectクラスとDictionaryクラスのdynamicコンボを使う。
コード
以下、簡略化したソースコード。
下記のクラスのインスタンス生成時にdynamicで変数を定義するのがポイント。
using System.Collections.Generic;
using System.Dynamic;
namespace Library
{
public class ArgsObject : DynamicObject
{
private Dictionary<string, object> dictionary;
public ArgsObject()
{
this.dictionary = new Dictionary<string, object>();
}
// プロパティに値を設定しようとしたときに呼ばれる
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.dictionary[binder.Name] = value;
return true;
}
// プロパティから値を取得しようとしたときに呼ばれる
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.dictionary[binder.Name];
return true;
}
public bool ContainsKey(string key)
{
return this.dictionary.ContainsKey(key);
}
}
}
使用例
namespace Usage{
public class UseDyanamic {
public void a() {
// ここでdynamicを使用することが大事
dynamic args = new ArgsObject();
args.AAA = "aaa";
args.BBB = 1;
}
}
}
結論
超快適!!
ダックタイピング大好きです!!
※ご使用時にはかなりの注意が必要です。ご使用の際は、ご自身の判断のもとお願いいたします。また、try-catchなどはここでは記載しておりません。ご自身の判断で追加してください。
参考URL
公式で似たようなことしている。
https://code.msdn.microsoft.com/windowsdesktop/30-DynamicObject-dynamic-8d1ff1e4
Qiitaにも似たような記事があった。
https://qiita.com/NetSeed/items/0210cfe514b1bb24d651