Advertisement
Guest User

Untitled

a guest
Jan 1st, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.34 KB | None | 0 0
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             var map = Map(testInt: 5, testString: "hello");
  6.  
  7.             map.testDouble = 10.5;
  8.  
  9.             map[10] = "number 10";
  10.  
  11.             Console.WriteLine(map.testInt);
  12.             Console.WriteLine(map.testString);
  13.             Console.WriteLine(map.testDouble);
  14.             Console.WriteLine(map[10]);
  15.             map.Remove(10);
  16.             Console.WriteLine(map[10, "10 default"]);
  17.             Console.WriteLine(map[15, "15 default"]);
  18.  
  19.             Console.ReadLine();
  20.         }
  21.  
  22.         static dynamic Map { get => new DynamicDictFactory(); }
  23.     }
  24.  
  25.     public class DynamicDictFactory : DynamicObject
  26.     {
  27.         private Dictionary<dynamic, dynamic> res = new Dictionary<dynamic, dynamic>();
  28.  
  29.         public void Clear() => res.Clear();
  30.         public void Remove(object key) => res.Remove(key);
  31.  
  32.         public override bool TrySetMember(SetMemberBinder binder, object value)
  33.         {
  34.             res[binder.Name] = value;
  35.             return true;
  36.         }
  37.  
  38.         public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
  39.         {
  40.             res[indexes[0]] = value;
  41.             return true;
  42.         }
  43.  
  44.         public override bool TryGetMember(GetMemberBinder binder, out object result)
  45.         {
  46.             if (res.ContainsKey(binder.Name))
  47.                 result = res[binder.Name];
  48.             else throw new ArgumentException();
  49.             return true;
  50.         }
  51.  
  52.         public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
  53.         {
  54.             if (res.ContainsKey(indexes[0]))
  55.                 result = res[indexes[0]];
  56.             else if (indexes.Length > 1)
  57.                 result = indexes[1];
  58.             else throw new ArgumentException();
  59.             return true;
  60.         }
  61.  
  62.         public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
  63.         {
  64.             var names = binder.CallInfo.ArgumentNames;
  65.  
  66.             for (var i = 0; i < args.Length; i++)
  67.             {
  68.                 var argName = names[i];
  69.                 if (string.IsNullOrEmpty(argName)) throw new ArgumentException();
  70.                 res[argName] = args[i];
  71.             }
  72.             result = this;
  73.             return true;
  74.         }
  75.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement