<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />

ReflectionDelegateFactory

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