{%- if HasDescription -%}
///
/// {{ Description | csharpdocs }}
///
{%- endif -%}
{%- if HasDiscriminator -%}
{%- if UseSystemTextJson -%}
{%- if UseSystemTextJsonPolymorphicSerialization -%}
[System.Text.Json.Serialization.JsonPolymorphic(TypeDiscriminatorPropertyName = "{{ Discriminator }}")]
{%- else -%}
[JsonInheritanceConverter(typeof({{ ClassName }}), "{{ Discriminator }}")]
{%- endif -%}
{%- else -%}
[Newtonsoft.Json.JsonConverter(typeof(JsonInheritanceConverter), "{{ Discriminator }}")]
{%- endif -%}
{%- for derivedClass in DerivedClasses -%}
{%- if derivedClass.IsAbstract != true -%}
{%- if UseSystemTextJson and UseSystemTextJsonPolymorphicSerialization -%}
[System.Text.Json.Serialization.JsonDerivedType(typeof({{ derivedClass.ClassName }}), typeDiscriminator: "{{ derivedClass.Discriminator }}")]
{%- else -%}
[JsonInheritanceAttribute("{{ derivedClass.Discriminator }}", typeof({{ derivedClass.ClassName }}))]
{%- endif -%}
{%- endif -%}
{%- endfor -%}
{%- endif -%}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "{{ ToolchainVersion }}")]
{%- if InheritsExceptionSchema -%}
{%- if UseSystemTextJson -%}
// TODO(system.text.json): What to do here?
{%- else -%}
[Newtonsoft.Json.JsonObjectAttribute]
{%- endif -%}
{%- endif -%}
{%- if IsDeprecated -%}
[System.Obsolete{% if HasDeprecatedMessage %}({{ DeprecatedMessage | literal }}){% endif %}]
{% endif -%}
{%- template Class.Annotations -%}
{{ TypeAccessModifier }} {% if IsAbstract %}abstract {% endif %}partial {{ ClassType }} {{ClassName}} {%- template Class.Inheritance %}
{
{%- if IsTuple -%}
public {{ ClassName }}({%- for tupleType in TupleTypes %}{{ tupleType }} item{{ forloop.index }}{%- if forloop.last == false %}, {% endif %}{% endfor %}) : base({%- for tupleType in TupleTypes %}item{{ forloop.index }}{%- if forloop.last == false %}, {% endif %}{% endfor %})
{
}
{%- endif -%}
{%- if RenderInpc or RenderPrism -%}
{%- for property in Properties -%}
private {{ property.Type }} {{ property.FieldName }}{%- if property.HasDefaultValue %} = {{ property.DefaultValue }}{% elsif GenerateNullableReferenceTypes %} = default!{%- endif %};
{%- endfor -%}
{%- endif -%}
{% template Class.Constructor %}
{%- if RenderRecord -%}
{% template Class.Constructor.Record %}
{%- endif %}
{%- for property in Properties -%}
{%- if property.HasDescription -%}
///
/// {{ property.Description | csharpdocs }}
///
{%- endif -%}
{%- if UseSystemTextJson -%}
[System.Text.Json.Serialization.JsonPropertyName("{{ property.Name }}")]
{%- if property.IsStringEnumArray -%}
// TODO(system.text.json): Add ItemConverterType with enum converter when supported
{%- endif -%}
{%- else -%}
[Newtonsoft.Json.JsonProperty("{{ property.Name }}", Required = {{ property.JsonPropertyRequiredCode }}{% if property.IsStringEnumArray %}, ItemConverterType = typeof(Newtonsoft.Json.Converters.StringEnumConverter){% endif %})]
{%- endif -%}
{%- if property.RenderRequiredAttribute -%}
[System.ComponentModel.DataAnnotations.Required{% if property.AllowEmptyStrings %}(AllowEmptyStrings = true){% endif %}]
{%- endif -%}
{%- if property.RenderRangeAttribute -%}
{%- if property.RangeType -%}
[System.ComponentModel.DataAnnotations.Range(typeof({{ property.RangeType }}), "{{ property.RangeMinimumValue }}", "{{ property.RangeMaximumValue }}")]
{%- else -%}
[System.ComponentModel.DataAnnotations.Range({{ property.RangeMinimumValue }}, {{ property.RangeMaximumValue }})]
{%- endif -%}
{%- endif -%}
{%- if property.RenderStringLengthAttribute -%}
[System.ComponentModel.DataAnnotations.StringLength({{ property.StringLengthMaximumValue }}{% if property.StringLengthMinimumValue > 0 %}, MinimumLength = {{ property.StringLengthMinimumValue }}{% endif %})]
{%- endif -%}
{%- if property.RenderMinLengthAttribute -%}
[System.ComponentModel.DataAnnotations.MinLength({{ property.MinLengthAttribute }})]
{%- endif -%}
{%- if property.RenderMaxLengthAttribute -%}
[System.ComponentModel.DataAnnotations.MaxLength({{ property.MaxLengthAttribute }})]
{%- endif -%}
{%- if property.RenderRegularExpressionAttribute -%}
[System.ComponentModel.DataAnnotations.RegularExpression(@"{{ property.RegularExpressionValue }}")]
{%- endif -%}
{%- if property.IsStringEnum -%}
{%- if UseSystemTextJson -%}
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<{{ property.Type | rtrimquestionmark }}>))]
{%- else -%}
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
{%- endif -%}
{%- endif -%}
{%- if property.IsDate and UseDateFormatConverter -%}
{%- if UseSystemTextJson -%}
[System.Text.Json.Serialization.JsonConverter(typeof(DateFormatConverter))]
{%- else -%}
[Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]
{%- endif -%}
{%- endif -%}
{%- if property.IsDeprecated -%}
[System.Obsolete{% if property.HasDeprecatedMessage %}({{ property.DeprecatedMessage | literal }}){% endif %}]
{%- endif -%}
{%- template Class.Property.Annotations -%}
public {% if UseRequiredKeyword and property.IsRequired %}required {% endif %}{{ property.Type }} {{ property.PropertyName }}{% if RenderInpc == false and RenderPrism == false %} { get; {% if property.HasSetter and RenderRecord == false %}{{ WriteAccessor }}; {% elsif RenderRecord and GenerateNativeRecords %}init; {% endif %}}{% if property.HasDefaultValue and RenderRecord == false and UseRequiredKeyword == false %} = {{ property.DefaultValue }};{% elsif GenerateNullableReferenceTypes and RenderRecord == false and UseRequiredKeyword == false %} = default!;{% endif %}
{%- else -%}
{
get { return {{ property.FieldName }}; }
{%- if property.HasSetter -%}
{%- if RenderInpc -%}
{{PropertySetterAccessModifier}}set
{
if ({{ property.FieldName }} != value)
{
{{ property.FieldName }} = value;
RaisePropertyChanged();
}
}
{%- else -%}
{{PropertySetterAccessModifier}}set { SetProperty(ref {{ property.FieldName }}, value); }
{%- endif -%}
{%- endif -%}
}
{%- endif -%}
{%- endfor -%}
{%- if GenerateAdditionalPropertiesProperty -%}
private System.Collections.Generic.IDictionary{% if GenerateNullableReferenceTypes %}?{% endif %} _additionalProperties;
{%- if UseSystemTextJson -%}
[System.Text.Json.Serialization.JsonExtensionData]
{%- else -%}
[Newtonsoft.Json.JsonExtensionData]
{%- endif -%}
public System.Collections.Generic.IDictionary AdditionalProperties
{
get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary()); }
{{PropertySetterAccessModifier}}set { _additionalProperties = value; }
}
{%- endif -%}
{%- if GenerateJsonMethods -%}
{% template Class.ToJson %}
{% template Class.FromJson %}
{%- endif -%}
{%- if RenderInpc -%}
{% template Class.Inpc %}
{%- endif -%}
{% template Class.Body %}
}