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 }