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()); }
private static string VisitBinding(MemberAssignment binding, ParameterExpression aggregateParameter, ParameterExpression currentParameter) { return(ExpressionUtilities.GetQuotedJsonPropertyName(binding.Member) + ": " + VisitSubExpression(binding.Expression, aggregateParameter, currentParameter)); }