ReflectionObject
                    class ReflectionObject
                
                using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace Newtonsoft.Json.Utilities
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal class ReflectionObject
    {
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })]
        [field: System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })]
        public ObjectConstructor<object> Creator {
            [return: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1
            })]
            get;
        }
        public IDictionary<string, ReflectionMember> Members { get; }
        private ReflectionObject([System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })] ObjectConstructor<object> creator)
        {
            Members = new Dictionary<string, ReflectionMember>();
            Creator = creator;
        }
        [return: System.Runtime.CompilerServices.Nullable(2)]
        public object GetValue(object target, string member)
        {
            return Members[member].Getter(target);
        }
        public void SetValue(object target, string member, [System.Runtime.CompilerServices.Nullable(2)] object value)
        {
            Members[member].Setter(target, value);
        }
        public Type GetType(string member)
        {
            return Members[member].MemberType;
        }
        public static ReflectionObject Create(Type t, params string[] memberNames)
        {
            return Create(t, null, memberNames);
        }
        public static ReflectionObject Create(Type t, [System.Runtime.CompilerServices.Nullable(2)] MethodBase creator, params string[] memberNames)
        {
            ReflectionDelegateFactory reflectionDelegateFactory = JsonTypeReflector.ReflectionDelegateFactory;
            ObjectConstructor<object> creator2 = null;
            if (creator != (MethodBase)null)
                creator2 = reflectionDelegateFactory.CreateParameterizedConstructor(creator);
            else if (ReflectionUtils.HasDefaultConstructor(t, false)) {
                Func<object> ctor = reflectionDelegateFactory.CreateDefaultConstructor<object>(t);
                creator2 = ((object[] args) => ctor());
            }
            ReflectionObject reflectionObject = new ReflectionObject(creator2);
            MethodCall<object, object> call;
            MethodCall<object, object> call2;
            foreach (string text in memberNames) {
                MemberInfo[] member = t.GetMember(text, BindingFlags.Instance | BindingFlags.Public);
                if (member.Length != 1)
                    throw new ArgumentException("Expected a single member with the name '{0}'.".FormatWith(CultureInfo.InvariantCulture, text));
                MemberInfo memberInfo = member.Single();
                ReflectionMember reflectionMember = new ReflectionMember();
                switch (memberInfo.MemberType()) {
                case MemberTypes.Field:
                case MemberTypes.Property:
                    if (ReflectionUtils.CanReadMemberValue(memberInfo, false))
                        reflectionMember.Getter = reflectionDelegateFactory.CreateGet<object>(memberInfo);
                    if (ReflectionUtils.CanSetMemberValue(memberInfo, false, false))
                        reflectionMember.Setter = reflectionDelegateFactory.CreateSet<object>(memberInfo);
                    break;
                case MemberTypes.Method: {
                    MethodInfo methodInfo = (MethodInfo)memberInfo;
                    if (methodInfo.IsPublic) {
                        ParameterInfo[] parameters = methodInfo.GetParameters();
                        if (parameters.Length == 0 && methodInfo.ReturnType != typeof(void)) {
                            call = reflectionDelegateFactory.CreateMethodCall<object>(methodInfo);
                            reflectionMember.Getter = ((object target) => call(target, Array.Empty<object>()));
                        } else if (parameters.Length == 1 && methodInfo.ReturnType == typeof(void)) {
                            call2 = reflectionDelegateFactory.CreateMethodCall<object>(methodInfo);
                            reflectionMember.Setter = delegate(object target, object arg) {
                                call2(target, arg);
                            };
                        }
                    }
                    break;
                }
                default:
                    throw new ArgumentException("Unexpected member type '{0}' for member '{1}'.".FormatWith(CultureInfo.InvariantCulture, memberInfo.MemberType(), memberInfo.Name));
                }
                reflectionMember.MemberType = ReflectionUtils.GetMemberUnderlyingType(memberInfo);
                reflectionObject.Members[text] = reflectionMember;
            }
            return reflectionObject;
        }
    }
}