private IEnumerable <MemberDeclarationSyntax> GenerateNewNodes(PropertyDeclarationSyntax property) { TypeSyntax valueType = property.Type.DescendantNodes() .OfType <GenericNameSyntax>() .First() .TypeArgumentList.Arguments[1]; bool isDynamic = SyntaxHelpers.IsDynamic(valueType, out bool isNullable); TypeSyntax wrapperType = isDynamic ? isNullable ? _jsonSerializationNamespace.NullableDynamicAdditionalPropertiesDictionary : _jsonSerializationNamespace.DynamicAdditionalPropertiesDictionary : _jsonSerializationNamespace.AdditionalPropertiesDictionary(valueType); yield return(_backingFieldDeclaration); yield return(FieldDeclaration(VariableDeclaration( NullableType(wrapperType), SingletonSeparatedList(VariableDeclarator(Identifier(WrapperFieldName))))) .AddModifiers(Token(SyntaxKind.PrivateKeyword))); yield return(property // Remove the getters and setters .WithAccessorList(null) // Remove the old initializer .WithInitializer(null) // Prevent serialization .AddAttributeLists(AttributeList(SingletonSeparatedList(Attribute(NewtonsoftJsonTypes.JsonIgnoreAttributeName)))) // Provide an AdditionalPropertiesDictionary referencing the backing field .WithExpressionBody(ArrowExpressionClause( AssignmentExpression(SyntaxKind.CoalesceAssignmentExpression, IdentifierName(WrapperFieldName), ObjectCreationExpression(wrapperType) .AddArgumentListArguments( Argument(IdentifierName(BackingFieldName))))))); }