using System; using System.Globalization; using System.Reflection; using DPumpHydr.WinFrmUI.WenSkin.Json.Utilities; namespace DPumpHydr.WinFrmUI.WenSkin.Json.Serialization { /// /// Get and set values for a using dynamic methods. /// public class DynamicValueProvider : IValueProvider { private readonly MemberInfo _memberInfo; private Func _getter; private Action _setter; /// /// Initializes a new instance of the class. /// /// The member info. public DynamicValueProvider(MemberInfo memberInfo) { ValidationUtils.ArgumentNotNull(memberInfo, "memberInfo"); _memberInfo = memberInfo; } /// /// Sets the value. /// /// The target to set the value on. /// The value to set on the target. public void SetValue(object target, object value) { try { if (_setter == null) { _setter = DynamicReflectionDelegateFactory.Instance.CreateSet(_memberInfo); } _setter(target, value); } catch (Exception innerException) { throw new JsonSerializationException("Error setting value to '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), innerException); } } /// /// Gets the value. /// /// The target to get the value from. /// The value. public object GetValue(object target) { try { if (_getter == null) { _getter = DynamicReflectionDelegateFactory.Instance.CreateGet(_memberInfo); } return _getter(target); } catch (Exception innerException) { throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), innerException); } } } }