private static string VisitSubExpression(MemberInitExpression expression,
                                                 ParameterExpression aggregateParameter)
        {
            if (expression.NewExpression.Arguments?.Any(x => x.NodeType != ExpressionType.Constant) == true)
            {
                throw new NotImplementedException();
            }

            object defaultValue = Activator.CreateInstance(expression.NewExpression.Type,
                                                           expression.NewExpression.Arguments.Cast <ConstantExpression>().Select(x => x.Value).ToArray());

            var sb = new StringBuilder("{ ");

            bool haveAnyMembersBeenWritten = false;

            foreach (var propertyOrField in expression.NewExpression.Type
                     .GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy)
                     .Where(ExpressionUtilities.ShouldSerialize))
            {
                if (haveAnyMembersBeenWritten)
                {
                    sb.Append(", ");
                }

                var memberBinding = expression.Bindings?.SingleOrDefault(x => x.Member == propertyOrField);
                if (memberBinding != null)
                {
                    sb.Append(VisitBinding(memberBinding, aggregateParameter));
                }
                else
                {
                    if (propertyOrField.MemberType == MemberTypes.Property)
                    {
                        sb.Append(ExpressionUtilities.GetQuotedJsonPropertyName(propertyOrField))
                        .Append(": ")
                        .Append(JsonConvert.SerializeObject(
                                    ((PropertyInfo)propertyOrField).GetValue(defaultValue)));
                    }
                    else if (propertyOrField.MemberType == MemberTypes.Field)
                    {
                        sb.Append(ExpressionUtilities.GetQuotedJsonPropertyName(propertyOrField))
                        .Append(": ")
                        .Append(JsonConvert.SerializeObject(
                                    ((FieldInfo)propertyOrField).GetValue(defaultValue)));
                    }
                    else
                    {
                        Debug.Fail($"{propertyOrField.MemberType} members should not be encountered here.");
                    }
                }

                haveAnyMembersBeenWritten = true;
            }

            sb.Append(" }");

            return(sb.ToString());
        }
예제 #2
0
 private static string VisitBinding(MemberAssignment binding, ParameterExpression aggregateParameter,
                                    ParameterExpression currentParameter)
 {
     return(ExpressionUtilities.GetQuotedJsonPropertyName(binding.Member) + ": "
            + VisitSubExpression(binding.Expression, aggregateParameter, currentParameter));
 }