public override Serialization.ObjectConstructor <object> CreateParameterizedConstructor(MethodBase method) { ValidationUtils.ArgumentNotNull(method, nameof(method)); Type type = typeof(object); ParameterExpression argsParameterExpression = Expression.Parameter(typeof(object[]), "args"); Expression callExpression = BuildMethodCall(method, type, null, argsParameterExpression); LambdaExpression lambdaExpression = Expression.Lambda(typeof(Serialization.ObjectConstructor <object>), callExpression, argsParameterExpression); Serialization.ObjectConstructor <object> compiled = (Serialization.ObjectConstructor <object>)lambdaExpression.Compile(); return(compiled); }
public static ReflectionObject Create(Type t, MethodBase?creator, params string[] memberNames) { ReflectionDelegateFactory delegateFactory = Serialization.JsonTypeReflector.ReflectionDelegateFactory; Serialization.ObjectConstructor <object>?creatorConstructor = null; if (creator != null) { creatorConstructor = delegateFactory.CreateParameterizedConstructor(creator); } else { if (ReflectionUtils.HasDefaultConstructor(t, false)) { Func <object> ctor = delegateFactory.CreateDefaultConstructor <object>(t); creatorConstructor = args => ctor(); } } ReflectionObject d = new ReflectionObject(creatorConstructor); foreach (string memberName in memberNames) { MemberInfo[] members = t.GetMember(memberName, BindingFlags.Instance | BindingFlags.Public); if (members.Length != 1) { throw new ArgumentException("Expected a single member with the name '{0}'.".FormatWith(CultureInfo.InvariantCulture, memberName)); } MemberInfo member = members.Single(); ReflectionMember reflectionMember = new ReflectionMember(); switch (member.MemberType()) { case MemberTypes.Field: case MemberTypes.Property: if (ReflectionUtils.CanReadMemberValue(member, false)) { reflectionMember.Getter = delegateFactory.CreateGet <object>(member); } if (ReflectionUtils.CanSetMemberValue(member, false, false)) { reflectionMember.Setter = delegateFactory.CreateSet <object>(member); } break; case MemberTypes.Method: MethodInfo method = (MethodInfo)member; if (method.IsPublic) { ParameterInfo[] parameters = method.GetParameters(); if (parameters.Length == 0 && method.ReturnType != typeof(void)) { MethodCall <object, object?> call = delegateFactory.CreateMethodCall <object>(method); reflectionMember.Getter = target => call(target); } else if (parameters.Length == 1 && method.ReturnType == typeof(void)) { MethodCall <object, object?> call = delegateFactory.CreateMethodCall <object>(method); reflectionMember.Setter = (target, arg) => call(target, arg); } } break; default: throw new ArgumentException("Unexpected member type '{0}' for member '{1}'.".FormatWith(CultureInfo.InvariantCulture, member.MemberType(), member.Name)); } reflectionMember.MemberType = ReflectionUtils.GetMemberUnderlyingType(member); d.Members[memberName] = reflectionMember; } return(d); }
private ReflectionObject(Serialization.ObjectConstructor <object>?creator) { Members = new Dictionary <string, ReflectionMember>(); Creator = creator; }