を使用DynamicObjectすると、より単純な辞書初期化子を作成することはそれほど難しくありません。
次のメソッドを呼び出したいと想像してください
void PrintDict(IDictionary<string, object> dict) {
foreach(var kv in dict) {
Console.WriteLine (" -> " + kv.Key + " = " + kv.Value);
}
}
次のようなリテラル構文を使用する
var dict = Dict (Hello: "World", IAm: "a dictionary");
PrintDict (dict);
これは、次のような動的オブジェクトを作成することで実現できます。
dynamic Dict {
get {
return new DynamicDictFactory ();
}
}
private class DynamicDictFactory : DynamicObject
{
public override bool TryInvoke (InvokeBinder binder, object[] args, out object result)
{
var res = new Dictionary<string, object> ();
var names = binder.CallInfo.ArgumentNames;
for (var i = 0; i < args.Length; i++) {
var argName = names [i];
if(string.IsNullOrEmpty(argName)) throw new ArgumentException();
res [argName] = args [i];
}
result = res;
return true;
}
}