LateBoundReflectionDelegateFactory
using Newtonsoft.Json.Serialization;
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace Newtonsoft.Json.Utilities
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal class LateBoundReflectionDelegateFactory : ReflectionDelegateFactory
    {
        private static readonly LateBoundReflectionDelegateFactory _instance = new LateBoundReflectionDelegateFactory();
        internal static ReflectionDelegateFactory Instance => _instance;
        public override ObjectConstructor<object> CreateParameterizedConstructor(MethodBase method)
        {
            ValidationUtils.ArgumentNotNull(method, "method");
            ConstructorInfo c = method as ConstructorInfo;
            if ((object)c != null)
                return (object[] a) => c.Invoke(a);
            return (object[] a) => method.Invoke(null, a);
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            1,
            2
        })]
        public override MethodCall<T, object> CreateMethodCall<[System.Runtime.CompilerServices.Nullable(2)] T>(MethodBase method)
        {
            ValidationUtils.ArgumentNotNull(method, "method");
            ConstructorInfo c = method as ConstructorInfo;
            if ((object)c != null)
                return (T o, object[] a) => c.Invoke(a);
            return (T o, object[] a) => method.Invoke(o, a);
        }
        public override Func<T> CreateDefaultConstructor<[System.Runtime.CompilerServices.Nullable(2)] T>(Type type)
        {
            ValidationUtils.ArgumentNotNull(type, "type");
            if (type.IsValueType())
                return () => (T)Activator.CreateInstance(type);
            ConstructorInfo constructorInfo = ReflectionUtils.GetDefaultConstructor(type, true);
            if ((object)constructorInfo == null)
                throw new InvalidOperationException("Unable to find default constructor for " + type.FullName);
            return () => (T)constructorInfo.Invoke(null);
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            1,
            2
        })]
        public override Func<T, object> CreateGet<[System.Runtime.CompilerServices.Nullable(2)] T>(PropertyInfo propertyInfo)
        {
            ValidationUtils.ArgumentNotNull(propertyInfo, "propertyInfo");
            return (T o) => propertyInfo.GetValue(o, null);
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            1,
            2
        })]
        public override Func<T, object> CreateGet<[System.Runtime.CompilerServices.Nullable(2)] T>(FieldInfo fieldInfo)
        {
            ValidationUtils.ArgumentNotNull(fieldInfo, "fieldInfo");
            return (T o) => fieldInfo.GetValue(o);
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            1,
            2
        })]
        public override Action<T, object> CreateSet<[System.Runtime.CompilerServices.Nullable(2)] T>(FieldInfo fieldInfo)
        {
            ValidationUtils.ArgumentNotNull(fieldInfo, "fieldInfo");
            return delegate(T o, object v) {
                fieldInfo.SetValue(o, v);
            };
        }
        [return: System.Runtime.CompilerServices.Nullable(new byte[] {
            1,
            1,
            2
        })]
        public override Action<T, object> CreateSet<[System.Runtime.CompilerServices.Nullable(2)] T>(PropertyInfo propertyInfo)
        {
            ValidationUtils.ArgumentNotNull(propertyInfo, "propertyInfo");
            return delegate(T o, object v) {
                propertyInfo.SetValue(o, v, null);
            };
        }
    }
}