Используя 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;
}
}