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