Edited at

C#に動的型付けを導入する

More than 1 year has passed since last update.


動機

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