ExpressionValueProvider
Get and set values for a  MemberInfo using dynamic methods.
            
                using Newtonsoft.Json.Utilities;
using System;
using System.Globalization;
using System.Reflection;
namespace Newtonsoft.Json.Serialization
{
    public class ExpressionValueProvider : IValueProvider
    {
        private readonly MemberInfo _memberInfo;
        private Func<object, object> _getter;
        private Action<object, object> _setter;
        public ExpressionValueProvider(MemberInfo memberInfo)
        {
            ValidationUtils.ArgumentNotNull(memberInfo, "memberInfo");
            _memberInfo = memberInfo;
        }
        public void SetValue(object target, object value)
        {
            try {
                if (_setter == null)
                    _setter = ExpressionReflectionDelegateFactory.Instance.CreateSet<object>(_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);
            }
        }
        public object GetValue(object target)
        {
            try {
                if (_getter == null)
                    _getter = ExpressionReflectionDelegateFactory.Instance.CreateGet<object>(_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);
            }
        }
    }
}