ReflectionDelegateFactory
using Newtonsoft.Json.Serialization;
using System;
using System.Globalization;
using System.Reflection;
namespace Newtonsoft.Json.Utilities
{
    internal abstract class ReflectionDelegateFactory
    {
        public Newtonsoft.Json.Serialization.Func<T, object> CreateGet<T>(MemberInfo memberInfo)
        {
            PropertyInfo propertyInfo;
            if ((object)(propertyInfo = (memberInfo as PropertyInfo)) != null) {
                if (propertyInfo.PropertyType.IsByRef)
                    throw new InvalidOperationException("Could not create getter for {0}. ByRef return values are not supported.".FormatWith(CultureInfo.InvariantCulture, propertyInfo));
                return CreateGet<T>(propertyInfo);
            }
            FieldInfo fieldInfo;
            if ((object)(fieldInfo = (memberInfo as FieldInfo)) != null)
                return CreateGet<T>(fieldInfo);
            throw new Exception("Could not create getter for {0}.".FormatWith(CultureInfo.InvariantCulture, memberInfo));
        }
        public Newtonsoft.Json.Serialization.Action<T, object> CreateSet<T>(MemberInfo memberInfo)
        {
            PropertyInfo propertyInfo;
            if ((object)(propertyInfo = (memberInfo as PropertyInfo)) != null)
                return CreateSet<T>(propertyInfo);
            FieldInfo fieldInfo;
            if ((object)(fieldInfo = (memberInfo as FieldInfo)) != null)
                return CreateSet<T>(fieldInfo);
            throw new Exception("Could not create setter for {0}.".FormatWith(CultureInfo.InvariantCulture, memberInfo));
        }
        public abstract MethodCall<T, object> CreateMethodCall<T>(MethodBase method);
        public abstract ObjectConstructor<object> CreateParameterizedConstructor(MethodBase method);
        public abstract Newtonsoft.Json.Serialization.Func<T> CreateDefaultConstructor<T>(Type type);
        public abstract Newtonsoft.Json.Serialization.Func<T, object> CreateGet<T>(PropertyInfo propertyInfo);
        public abstract Newtonsoft.Json.Serialization.Func<T, object> CreateGet<T>(FieldInfo fieldInfo);
        public abstract Newtonsoft.Json.Serialization.Action<T, object> CreateSet<T>(FieldInfo fieldInfo);
        public abstract Newtonsoft.Json.Serialization.Action<T, object> CreateSet<T>(PropertyInfo propertyInfo);
    }
}