/// /// {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} /// [DataContract] {{#generatePropertyChanged}} [ImplementPropertyChanged] {{/generatePropertyChanged}} {{>visibility}} partial class {{classname}} : {{#parent}}{{{parent}}}, {{/parent}} IEquatable<{{classname}}>{{^netStandard}}{{#validatable}}, IValidatableObject{{/validatable}}{{/netStandard}} { {{#vars}} {{#isEnum}} {{>modelInnerEnum}} {{/isEnum}} {{#items.isEnum}} {{#items}} {{>modelInnerEnum}} {{/items}} {{/items.isEnum}} {{/vars}} {{#vars}} {{#isEnum}} /// /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} /// {{#description}} /// {{{description}}}{{/description}} [DataMember(Name="{{baseName}}", EmitDefaultValue={{emitDefaultValue}})] public {{{datatypeWithEnum}}}{{#isEnum}}{{^isContainer}}?{{/isContainer}}{{/isEnum}} {{name}} { get; set; } {{/isEnum}} {{/vars}} {{#hasRequired}} {{^hasOnlyReadOnly}} /// /// Initializes a new instance of the class. /// [JsonConstructorAttribute] protected {{classname}}() { } {{/hasOnlyReadOnly}} {{/hasRequired}} /// /// Initializes a new instance of the class. /// {{#vars}} {{^isReadOnly}} /// {{#description}}{{description}}{{/description}}{{^description}}{{name}}{{/description}}{{#required}} (required){{/required}}{{#defaultValue}} (default to {{defaultValue}}){{/defaultValue}}. {{/isReadOnly}} {{/vars}} {{#hasOnlyReadOnly}} [JsonConstructorAttribute] {{/hasOnlyReadOnly}} public {{classname}}({{#readWriteVars}}{{{datatypeWithEnum}}}{{#isEnum}}{{^isContainer}}?{{/isContainer}}{{/isEnum}} {{name}} = {{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}default({{{datatypeWithEnum}}}{{#isEnum}}{{^isContainer}}?{{/isContainer}}{{/isEnum}}){{/defaultValue}}{{^-last}}, {{/-last}}{{/readWriteVars}}) { {{#vars}} {{^isReadOnly}} {{#required}} // to ensure "{{name}}" is required (not null) if ({{name}} == null) { throw new InvalidDataException("{{name}} is a required property for {{classname}} and cannot be null"); } else { this.{{name}} = {{name}}; } {{/required}} {{/isReadOnly}} {{/vars}} {{#vars}} {{^isReadOnly}} {{^required}} {{#defaultValue}}// use default value if no "{{name}}" provided if ({{name}} == null) { this.{{name}} = {{{defaultValue}}}; } else { this.{{name}} = {{name}}; } {{/defaultValue}} {{^defaultValue}} this.{{name}} = {{name}}; {{/defaultValue}} {{/required}} {{/isReadOnly}} {{/vars}} } {{#vars}} {{^isEnum}} /// /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}} /// {{#description}} /// {{description}}{{/description}} [DataMember(Name="{{baseName}}", EmitDefaultValue={{emitDefaultValue}})] public {{{datatype}}} {{name}} { get; {{#isReadOnly}}private {{/isReadOnly}}set; } {{/isEnum}} {{/vars}} /// /// Returns the string presentation of the object /// /// String presentation of the object public override string ToString() { var sb = new StringBuilder(); sb.Append("class {{classname}} {\n"); {{#vars}} sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); {{/vars}} sb.Append("}\n"); return sb.ToString(); } /// /// Returns the JSON string presentation of the object /// /// JSON string presentation of the object public {{#parent}} new {{/parent}}string ToJson() { return JsonConvert.SerializeObject(this, Formatting.Indented); } /// /// Returns true if objects are equal /// /// Object to be compared /// Boolean public override bool Equals(object obj) { // credit: http://stackoverflow.com/a/10454552/677735 return this.Equals(obj as {{classname}}); } /// /// Returns true if {{classname}} instances are equal /// /// Instance of {{classname}} to be compared /// Boolean public bool Equals({{classname}} other) { // credit: http://stackoverflow.com/a/10454552/677735 if (other == null) return false; return {{#vars}}{{#isNotContainer}} ( this.{{name}} == other.{{name}} || this.{{name}} != null && this.{{name}}.Equals(other.{{name}}) ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{^isNotContainer}} ( this.{{name}} == other.{{name}} || this.{{name}} != null && this.{{name}}.SequenceEqual(other.{{name}}) ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}{{^vars}}false{{/vars}}; } /// /// Gets the hash code /// /// Hash code public override int GetHashCode() { // credit: http://stackoverflow.com/a/263416/677735 unchecked // Overflow is fine, just wrap { int hash = 41; // Suitable nullity checks etc, of course :) {{#vars}} if (this.{{name}} != null) hash = hash * 59 + this.{{name}}.GetHashCode(); {{/vars}} return hash; } } {{^netStandard}} {{#generatePropertyChanged}} /// /// Property changed event handler /// public event PropertyChangedEventHandler PropertyChanged; /// /// Trigger when a property changed /// /// Property Name public virtual void OnPropertyChanged(string propertyName) { // NOTE: property changed is handled via "code weaving" using Fody. // Properties with setters are modified at compile time to notify of changes. var propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } {{/generatePropertyChanged}} {{#validatable}} /// /// To validate all properties of the instance /// /// Validation context /// Validation Result IEnumerable IValidatableObject.Validate(ValidationContext validationContext) { {{#vars}} {{#hasValidation}} {{#maxLength}} // {{{name}}} ({{{datatype}}}) maxLength if(this.{{{name}}} != null && this.{{{name}}}.Length > {{maxLength}}) { yield return new System.ComponentModel.DataAnnotations.ValidationResult("Invalid value for {{{name}}}, length must be less than {{maxLength}}.", new [] { "{{{name}}}" }); } {{/maxLength}} {{#minLength}} // {{{name}}} ({{{datatype}}}) minLength if(this.{{{name}}} != null && this.{{{name}}}.Length < {{minLength}}) { yield return new System.ComponentModel.DataAnnotations.ValidationResult("Invalid value for {{{name}}}, length must be greater than {{minLength}}.", new [] { "{{{name}}}" }); } {{/minLength}} {{#maximum}} // {{{name}}} ({{{datatype}}}) maximum if(this.{{{name}}} > ({{{datatype}}}){{maximum}}) { yield return new System.ComponentModel.DataAnnotations.ValidationResult("Invalid value for {{{name}}}, must be a value less than or equal to {{maximum}}.", new [] { "{{{name}}}" }); } {{/maximum}} {{#minimum}} // {{{name}}} ({{{datatype}}}) minimum if(this.{{{name}}} < ({{{datatype}}}){{minimum}}) { yield return new System.ComponentModel.DataAnnotations.ValidationResult("Invalid value for {{{name}}}, must be a value greater than or equal to {{minimum}}.", new [] { "{{{name}}}" }); } {{/minimum}} {{#pattern}} // {{{name}}} ({{{datatype}}}) pattern Regex regex{{{name}}} = new Regex(@"{{{vendorExtensions.x-regex}}}"{{#vendorExtensions.x-modifiers}}{{#-first}}, {{/-first}}RegexOptions.{{{.}}}{{^-last}} | {{/-last}}{{/vendorExtensions.x-modifiers}}); if (false == regex{{{name}}}.Match(this.{{{name}}}).Success) { yield return new System.ComponentModel.DataAnnotations.ValidationResult("Invalid value for {{{name}}}, must match a pattern of {{{pattern}}}.", new [] { "{{{name}}}" }); } {{/pattern}} {{/hasValidation}} {{/vars}} yield break; } {{/validatable}} {{/netStandard}} }