1 //
2 // Copyright (c) 2010-2018 Antmicro
3 //
4 //  This file is licensed under the MIT License.
5 //  Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using System.Collections.Generic;
9 using System.Dynamic;
10 
11 namespace Antmicro.Renode.Utilities.Packets
12 {
13     public class DynamicPropertiesObject : DynamicObject
14     {
DynamicPropertiesObject()15         public DynamicPropertiesObject()
16         {
17             fields = new Dictionary<string, object>();
18             setters = new Dictionary<string, Action<object>>();
19             getters = new Dictionary<string, Func<object>>();
20         }
21 
ProvideProperty(string name, Action<object> setter = null, Func<object> getter = null)22         public void ProvideProperty(string name, Action<object> setter = null, Func<object> getter = null)
23         {
24             if(setter != null)
25             {
26                 setters[name] = setter;
27             }
28             if(getter != null)
29             {
30                 getters[name] = getter;
31             }
32         }
33 
TrySetMember(SetMemberBinder binder, object value)34         public override bool TrySetMember(SetMemberBinder binder, object value)
35         {
36             if(setters.TryGetValue(binder.Name, out var setter))
37             {
38                 setter(value);
39                 return true;
40             }
41 
42             fields[binder.Name] = value;
43             return true;
44         }
45 
TryGetMember(GetMemberBinder binder, out object result)46         public override bool TryGetMember(GetMemberBinder binder, out object result)
47         {
48 
49             if(getters.TryGetValue(binder.Name, out var getter))
50             {
51                 result = getter();
52                 return true;
53             }
54 
55             if(!fields.TryGetValue(binder.Name, out result))
56             {
57                 return base.TryGetMember(binder, out result);
58             }
59 
60             return true;
61         }
62 
63         private readonly Dictionary<string, object> fields;
64 
65         private readonly Dictionary<string, Func<object>> getters;
66         private readonly Dictionary<string, Action<object>> setters;
67     }
68 }