Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Program
- {
- static void Main(string[] args)
- {
- var map = Map(testInt: 5, testString: "hello");
- map.testDouble = 10.5;
- map[10] = "number 10";
- Console.WriteLine(map.testInt);
- Console.WriteLine(map.testString);
- Console.WriteLine(map.testDouble);
- Console.WriteLine(map[10]);
- map.Remove(10);
- Console.WriteLine(map[10, "10 default"]);
- Console.WriteLine(map[15, "15 default"]);
- Console.ReadLine();
- }
- static dynamic Map { get => new DynamicDictFactory(); }
- }
- public class DynamicDictFactory : DynamicObject
- {
- private Dictionary<dynamic, dynamic> res = new Dictionary<dynamic, dynamic>();
- public void Clear() => res.Clear();
- public void Remove(object key) => res.Remove(key);
- public override bool TrySetMember(SetMemberBinder binder, object value)
- {
- res[binder.Name] = value;
- return true;
- }
- public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
- {
- res[indexes[0]] = value;
- return true;
- }
- public override bool TryGetMember(GetMemberBinder binder, out object result)
- {
- if (res.ContainsKey(binder.Name))
- result = res[binder.Name];
- else throw new ArgumentException();
- return true;
- }
- public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
- {
- if (res.ContainsKey(indexes[0]))
- result = res[indexes[0]];
- else if (indexes.Length > 1)
- result = indexes[1];
- else throw new ArgumentException();
- return true;
- }
- public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
- {
- 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 = this;
- return true;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement