in src/AutoRest.CSharp/Common/Output/Models/Types/SchemaObjectType.cs [161:268]
protected override ObjectTypeConstructor BuildSerializationConstructor()
{
bool ownsDiscriminatorProperty = false;
List<Parameter> serializationConstructorParameters = new List<Parameter>();
List<ObjectPropertyInitializer> serializationInitializers = new List<ObjectPropertyInitializer>();
ObjectTypeConstructor? baseSerializationCtor = null;
List<ValueExpression> baseParameterInitializers = new List<ValueExpression>();
if (Inherits is { IsFrameworkType: false, Implementation: ObjectType objectType })
{
baseSerializationCtor = objectType.SerializationConstructor;
foreach (var p in baseSerializationCtor.Signature.Parameters)
{
if (p.IsRawData && AdditionalPropertiesProperty != null)
{
baseParameterInitializers.Add(Snippets.Null);
// do not add into the list
}
else
{
baseParameterInitializers.Add(p);
serializationConstructorParameters.Add(p);
}
}
}
foreach (var property in Properties)
{
// skip the flattened properties, we should never include them in serialization
if (property is FlattenedObjectTypeProperty)
continue;
var type = property.Declaration.Type;
var deserializationParameter = new Parameter(
property.Declaration.Name.ToVariableName(),
property.ParameterDescription,
type,
null,
ValidationType.None,
null
);
ownsDiscriminatorProperty |= property == Discriminator?.Property;
serializationConstructorParameters.Add(deserializationParameter);
serializationInitializers.Add(new ObjectPropertyInitializer(property, deserializationParameter, GetPropertyDefaultValue(property)));
}
// add the raw data to serialization ctor parameter list
if (RawDataField != null)
{
var deserializationParameter = new Parameter(
RawDataField.Declaration.Name.ToVariableName(),
RawDataField.ParameterDescription,
RawDataField.Declaration.Type,
null,
ValidationType.None,
null
)
{
IsRawData = true
};
serializationConstructorParameters.Add(deserializationParameter);
serializationInitializers.Add(new ObjectPropertyInitializer(RawDataField, deserializationParameter, null));
}
if (InitializationConstructor.Signature.Parameters
.Select(p => p.Type)
.SequenceEqual(serializationConstructorParameters.Select(p => p.Type)))
{
return InitializationConstructor;
}
if (Discriminator != null)
{
// Add discriminator initializer to constructor at every level of hierarchy
if (!ownsDiscriminatorProperty &&
baseSerializationCtor != null)
{
var discriminatorParameter = baseSerializationCtor.FindParameterByInitializedProperty(Discriminator.Property);
Debug.Assert(discriminatorParameter != null);
ReferenceOrConstant? defaultValue = null;
if (discriminatorParameter.Type.CanBeInitializedInline(Discriminator.Value))
{
defaultValue = Discriminator.Value;
}
serializationInitializers.Add(new ObjectPropertyInitializer(Discriminator.Property, discriminatorParameter, defaultValue));
}
}
var initializer = new ConstructorInitializer(true, baseParameterInitializers);
var signature = new ConstructorSignature(
Type,
$"Initializes a new instance of {Type:C}",
null,
IsInheritableCommonType ? Protected : Internal,
serializationConstructorParameters,
Initializer: initializer);
return new ObjectTypeConstructor(
signature,
serializationInitializers,
baseSerializationCtor);
}