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);
}
}
}
}