/* 
 * bSDD API prototype
 *
 * API to access the buildingSMART Data Dictionary
 *
 * OpenAPI spec version: v1
 * Contact: bsdd_support@buildingsmart.org
 * Generated by: https://github.com/swagger-api/swagger-codegen.git
 */
using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.ComponentModel.DataAnnotations;
using SwaggerDateConverter = IO.Swagger.Client.SwaggerDateConverter;

namespace IO.Swagger.Model
{
    /// <summary>
    /// ClassificationContractV3
    /// </summary>
    [DataContract]
        public partial class ClassificationContractV3 :  IEquatable<ClassificationContractV3>, IValidatableObject
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ClassificationContractV3" /> class.
        /// </summary>
        /// <param name="synonyms">List of synonyms for the classification.</param>
        /// <param name="relatedIfcEntityNames">List of related IFC entity names (version independent).</param>
        /// <param name="parentClassificationReference">parentClassificationReference.</param>
        /// <param name="classificationProperties">List of the properties of this classification.</param>
        /// <param name="classificationRelations">List of relations to other classifications, can be reference to classifications of other domains.</param>
        /// <param name="childClassificationReferences">List of child classifications (only filled if requested).</param>
        /// <param name="activationDateUtc">Date of activation (required).</param>
        /// <param name="code">Code used originally by the domain (required).</param>
        /// <param name="creatorLanguageCode">Language code of the creator.</param>
        /// <param name="countriesOfUse">List of countries where used.</param>
        /// <param name="countryOfOrigin">Country of origin.</param>
        /// <param name="deActivationDateUtc">Date of deactivation.</param>
        /// <param name="definition">Definition.</param>
        /// <param name="deprecationExplanation">Explanation of the deprecation.</param>
        /// <param name="documentReference">Reference to a(n official) document.</param>
        /// <param name="name">Name (required).</param>
        /// <param name="namespaceUri">Unique identification (required).</param>
        /// <param name="replacedObjectCodes">List of codes of the replaced items.</param>
        /// <param name="replacingObjectCodes">List of codes of the replacing items.</param>
        /// <param name="revisionDateUtc">Date of the revision.</param>
        /// <param name="revisionNumber">Revision number.</param>
        /// <param name="status">Status, can be: Preview, Active or Inactive (required).</param>
        /// <param name="subdivisionsOfUse">List of subdivisions (e.g. states) where used.</param>
        /// <param name="uid">Alternative unique global identification.</param>
        /// <param name="versionDateUtc">Date of the version (required).</param>
        /// <param name="versionNumber">Version number.</param>
        /// <param name="visualRepresentationUri">URI of a visual representation.</param>
        public ClassificationContractV3(List<string> synonyms = default(List<string>), List<string> relatedIfcEntityNames = default(List<string>), ClassificationReferenceContractV3 parentClassificationReference = default(ClassificationReferenceContractV3), List<ClassificationPropertyContractV3> classificationProperties = default(List<ClassificationPropertyContractV3>), List<ClassificationRelationContractV3> classificationRelations = default(List<ClassificationRelationContractV3>), List<ClassificationReferenceContractV3> childClassificationReferences = default(List<ClassificationReferenceContractV3>), DateTime? activationDateUtc = default(DateTime?), string code = default(string), string creatorLanguageCode = default(string), List<string> countriesOfUse = default(List<string>), string countryOfOrigin = default(string), DateTime? deActivationDateUtc = default(DateTime?), string definition = default(string), string deprecationExplanation = default(string), string documentReference = default(string), string name = default(string), string namespaceUri = default(string), List<string> replacedObjectCodes = default(List<string>), List<string> replacingObjectCodes = default(List<string>), DateTime? revisionDateUtc = default(DateTime?), int? revisionNumber = default(int?), string status = default(string), List<string> subdivisionsOfUse = default(List<string>), string uid = default(string), DateTime? versionDateUtc = default(DateTime?), int? versionNumber = default(int?), string visualRepresentationUri = default(string))
        {
            // to ensure "activationDateUtc" is required (not null)
            if (activationDateUtc == null)
            {
                throw new InvalidDataException("activationDateUtc is a required property for ClassificationContractV3 and cannot be null");
            }
            else
            {
                this.ActivationDateUtc = activationDateUtc;
            }
            // to ensure "code" is required (not null)
            if (code == null)
            {
                throw new InvalidDataException("code is a required property for ClassificationContractV3 and cannot be null");
            }
            else
            {
                this.Code = code;
            }
            // to ensure "name" is required (not null)
            if (name == null)
            {
                throw new InvalidDataException("name is a required property for ClassificationContractV3 and cannot be null");
            }
            else
            {
                this.Name = name;
            }
            // to ensure "namespaceUri" is required (not null)
            if (namespaceUri == null)
            {
                throw new InvalidDataException("namespaceUri is a required property for ClassificationContractV3 and cannot be null");
            }
            else
            {
                this.NamespaceUri = namespaceUri;
            }
            // to ensure "status" is required (not null)
            if (status == null)
            {
                throw new InvalidDataException("status is a required property for ClassificationContractV3 and cannot be null");
            }
            else
            {
                this.Status = status;
            }
            // to ensure "versionDateUtc" is required (not null)
            if (versionDateUtc == null)
            {
                throw new InvalidDataException("versionDateUtc is a required property for ClassificationContractV3 and cannot be null");
            }
            else
            {
                this.VersionDateUtc = versionDateUtc;
            }
            this.Synonyms = synonyms;
            this.RelatedIfcEntityNames = relatedIfcEntityNames;
            this.ParentClassificationReference = parentClassificationReference;
            this.ClassificationProperties = classificationProperties;
            this.ClassificationRelations = classificationRelations;
            this.ChildClassificationReferences = childClassificationReferences;
            this.CreatorLanguageCode = creatorLanguageCode;
            this.CountriesOfUse = countriesOfUse;
            this.CountryOfOrigin = countryOfOrigin;
            this.DeActivationDateUtc = deActivationDateUtc;
            this.Definition = definition;
            this.DeprecationExplanation = deprecationExplanation;
            this.DocumentReference = documentReference;
            this.ReplacedObjectCodes = replacedObjectCodes;
            this.ReplacingObjectCodes = replacingObjectCodes;
            this.RevisionDateUtc = revisionDateUtc;
            this.RevisionNumber = revisionNumber;
            this.SubdivisionsOfUse = subdivisionsOfUse;
            this.Uid = uid;
            this.VersionNumber = versionNumber;
            this.VisualRepresentationUri = visualRepresentationUri;
        }
        
        /// <summary>
        /// List of synonyms for the classification
        /// </summary>
        /// <value>List of synonyms for the classification</value>
        [DataMember(Name="synonyms", EmitDefaultValue=false)]
        public List<string> Synonyms { get; set; }

        /// <summary>
        /// List of related IFC entity names (version independent)
        /// </summary>
        /// <value>List of related IFC entity names (version independent)</value>
        [DataMember(Name="relatedIfcEntityNames", EmitDefaultValue=false)]
        public List<string> RelatedIfcEntityNames { get; set; }

        /// <summary>
        /// Gets or Sets ParentClassificationReference
        /// </summary>
        [DataMember(Name="parentClassificationReference", EmitDefaultValue=false)]
        public ClassificationReferenceContractV3 ParentClassificationReference { get; set; }

        /// <summary>
        /// List of the properties of this classification
        /// </summary>
        /// <value>List of the properties of this classification</value>
        [DataMember(Name="classificationProperties", EmitDefaultValue=false)]
        public List<ClassificationPropertyContractV3> ClassificationProperties { get; set; }

        /// <summary>
        /// List of relations to other classifications, can be reference to classifications of other domains
        /// </summary>
        /// <value>List of relations to other classifications, can be reference to classifications of other domains</value>
        [DataMember(Name="classificationRelations", EmitDefaultValue=false)]
        public List<ClassificationRelationContractV3> ClassificationRelations { get; set; }

        /// <summary>
        /// List of child classifications (only filled if requested)
        /// </summary>
        /// <value>List of child classifications (only filled if requested)</value>
        [DataMember(Name="childClassificationReferences", EmitDefaultValue=false)]
        public List<ClassificationReferenceContractV3> ChildClassificationReferences { get; set; }

        /// <summary>
        /// Date of activation
        /// </summary>
        /// <value>Date of activation</value>
        [DataMember(Name="activationDateUtc", EmitDefaultValue=false)]
        public DateTime? ActivationDateUtc { get; set; }

        /// <summary>
        /// Code used originally by the domain
        /// </summary>
        /// <value>Code used originally by the domain</value>
        [DataMember(Name="code", EmitDefaultValue=false)]
        public string Code { get; set; }

        /// <summary>
        /// Language code of the creator
        /// </summary>
        /// <value>Language code of the creator</value>
        [DataMember(Name="creatorLanguageCode", EmitDefaultValue=false)]
        public string CreatorLanguageCode { get; set; }

        /// <summary>
        /// List of countries where used
        /// </summary>
        /// <value>List of countries where used</value>
        [DataMember(Name="countriesOfUse", EmitDefaultValue=false)]
        public List<string> CountriesOfUse { get; set; }

        /// <summary>
        /// Country of origin
        /// </summary>
        /// <value>Country of origin</value>
        [DataMember(Name="countryOfOrigin", EmitDefaultValue=false)]
        public string CountryOfOrigin { get; set; }

        /// <summary>
        /// Date of deactivation
        /// </summary>
        /// <value>Date of deactivation</value>
        [DataMember(Name="deActivationDateUtc", EmitDefaultValue=false)]
        public DateTime? DeActivationDateUtc { get; set; }

        /// <summary>
        /// Definition
        /// </summary>
        /// <value>Definition</value>
        [DataMember(Name="definition", EmitDefaultValue=false)]
        public string Definition { get; set; }

        /// <summary>
        /// Explanation of the deprecation
        /// </summary>
        /// <value>Explanation of the deprecation</value>
        [DataMember(Name="deprecationExplanation", EmitDefaultValue=false)]
        public string DeprecationExplanation { get; set; }

        /// <summary>
        /// Reference to a(n official) document
        /// </summary>
        /// <value>Reference to a(n official) document</value>
        [DataMember(Name="documentReference", EmitDefaultValue=false)]
        public string DocumentReference { get; set; }

        /// <summary>
        /// Name
        /// </summary>
        /// <value>Name</value>
        [DataMember(Name="name", EmitDefaultValue=false)]
        public string Name { get; set; }

        /// <summary>
        /// Unique identification
        /// </summary>
        /// <value>Unique identification</value>
        [DataMember(Name="namespaceUri", EmitDefaultValue=false)]
        public string NamespaceUri { get; set; }

        /// <summary>
        /// List of codes of the replaced items
        /// </summary>
        /// <value>List of codes of the replaced items</value>
        [DataMember(Name="replacedObjectCodes", EmitDefaultValue=false)]
        public List<string> ReplacedObjectCodes { get; set; }

        /// <summary>
        /// List of codes of the replacing items
        /// </summary>
        /// <value>List of codes of the replacing items</value>
        [DataMember(Name="replacingObjectCodes", EmitDefaultValue=false)]
        public List<string> ReplacingObjectCodes { get; set; }

        /// <summary>
        /// Date of the revision
        /// </summary>
        /// <value>Date of the revision</value>
        [DataMember(Name="revisionDateUtc", EmitDefaultValue=false)]
        public DateTime? RevisionDateUtc { get; set; }

        /// <summary>
        /// Revision number
        /// </summary>
        /// <value>Revision number</value>
        [DataMember(Name="revisionNumber", EmitDefaultValue=false)]
        public int? RevisionNumber { get; set; }

        /// <summary>
        /// Status, can be: Preview, Active or Inactive
        /// </summary>
        /// <value>Status, can be: Preview, Active or Inactive</value>
        [DataMember(Name="status", EmitDefaultValue=false)]
        public string Status { get; set; }

        /// <summary>
        /// List of subdivisions (e.g. states) where used
        /// </summary>
        /// <value>List of subdivisions (e.g. states) where used</value>
        [DataMember(Name="subdivisionsOfUse", EmitDefaultValue=false)]
        public List<string> SubdivisionsOfUse { get; set; }

        /// <summary>
        /// Alternative unique global identification
        /// </summary>
        /// <value>Alternative unique global identification</value>
        [DataMember(Name="uid", EmitDefaultValue=false)]
        public string Uid { get; set; }

        /// <summary>
        /// Date of the version
        /// </summary>
        /// <value>Date of the version</value>
        [DataMember(Name="versionDateUtc", EmitDefaultValue=false)]
        public DateTime? VersionDateUtc { get; set; }

        /// <summary>
        /// Version number
        /// </summary>
        /// <value>Version number</value>
        [DataMember(Name="versionNumber", EmitDefaultValue=false)]
        public int? VersionNumber { get; set; }

        /// <summary>
        /// URI of a visual representation
        /// </summary>
        /// <value>URI of a visual representation</value>
        [DataMember(Name="visualRepresentationUri", EmitDefaultValue=false)]
        public string VisualRepresentationUri { get; set; }

        /// <summary>
        /// Returns the string presentation of the object
        /// </summary>
        /// <returns>String presentation of the object</returns>
        public override string ToString()
        {
            var sb = new StringBuilder();
            sb.Append("class ClassificationContractV3 {\n");
            sb.Append("  Synonyms: ").Append(Synonyms).Append("\n");
            sb.Append("  RelatedIfcEntityNames: ").Append(RelatedIfcEntityNames).Append("\n");
            sb.Append("  ParentClassificationReference: ").Append(ParentClassificationReference).Append("\n");
            sb.Append("  ClassificationProperties: ").Append(ClassificationProperties).Append("\n");
            sb.Append("  ClassificationRelations: ").Append(ClassificationRelations).Append("\n");
            sb.Append("  ChildClassificationReferences: ").Append(ChildClassificationReferences).Append("\n");
            sb.Append("  ActivationDateUtc: ").Append(ActivationDateUtc).Append("\n");
            sb.Append("  Code: ").Append(Code).Append("\n");
            sb.Append("  CreatorLanguageCode: ").Append(CreatorLanguageCode).Append("\n");
            sb.Append("  CountriesOfUse: ").Append(CountriesOfUse).Append("\n");
            sb.Append("  CountryOfOrigin: ").Append(CountryOfOrigin).Append("\n");
            sb.Append("  DeActivationDateUtc: ").Append(DeActivationDateUtc).Append("\n");
            sb.Append("  Definition: ").Append(Definition).Append("\n");
            sb.Append("  DeprecationExplanation: ").Append(DeprecationExplanation).Append("\n");
            sb.Append("  DocumentReference: ").Append(DocumentReference).Append("\n");
            sb.Append("  Name: ").Append(Name).Append("\n");
            sb.Append("  NamespaceUri: ").Append(NamespaceUri).Append("\n");
            sb.Append("  ReplacedObjectCodes: ").Append(ReplacedObjectCodes).Append("\n");
            sb.Append("  ReplacingObjectCodes: ").Append(ReplacingObjectCodes).Append("\n");
            sb.Append("  RevisionDateUtc: ").Append(RevisionDateUtc).Append("\n");
            sb.Append("  RevisionNumber: ").Append(RevisionNumber).Append("\n");
            sb.Append("  Status: ").Append(Status).Append("\n");
            sb.Append("  SubdivisionsOfUse: ").Append(SubdivisionsOfUse).Append("\n");
            sb.Append("  Uid: ").Append(Uid).Append("\n");
            sb.Append("  VersionDateUtc: ").Append(VersionDateUtc).Append("\n");
            sb.Append("  VersionNumber: ").Append(VersionNumber).Append("\n");
            sb.Append("  VisualRepresentationUri: ").Append(VisualRepresentationUri).Append("\n");
            sb.Append("}\n");
            return sb.ToString();
        }
  
        /// <summary>
        /// Returns the JSON string presentation of the object
        /// </summary>
        /// <returns>JSON string presentation of the object</returns>
        public virtual string ToJson()
        {
            return JsonConvert.SerializeObject(this, Formatting.Indented);
        }

        /// <summary>
        /// Returns true if objects are equal
        /// </summary>
        /// <param name="input">Object to be compared</param>
        /// <returns>Boolean</returns>
        public override bool Equals(object input)
        {
            return this.Equals(input as ClassificationContractV3);
        }

        /// <summary>
        /// Returns true if ClassificationContractV3 instances are equal
        /// </summary>
        /// <param name="input">Instance of ClassificationContractV3 to be compared</param>
        /// <returns>Boolean</returns>
        public bool Equals(ClassificationContractV3 input)
        {
            if (input == null)
                return false;

            return 
                (
                    this.Synonyms == input.Synonyms ||
                    this.Synonyms != null &&
                    input.Synonyms != null &&
                    this.Synonyms.SequenceEqual(input.Synonyms)
                ) && 
                (
                    this.RelatedIfcEntityNames == input.RelatedIfcEntityNames ||
                    this.RelatedIfcEntityNames != null &&
                    input.RelatedIfcEntityNames != null &&
                    this.RelatedIfcEntityNames.SequenceEqual(input.RelatedIfcEntityNames)
                ) && 
                (
                    this.ParentClassificationReference == input.ParentClassificationReference ||
                    (this.ParentClassificationReference != null &&
                    this.ParentClassificationReference.Equals(input.ParentClassificationReference))
                ) && 
                (
                    this.ClassificationProperties == input.ClassificationProperties ||
                    this.ClassificationProperties != null &&
                    input.ClassificationProperties != null &&
                    this.ClassificationProperties.SequenceEqual(input.ClassificationProperties)
                ) && 
                (
                    this.ClassificationRelations == input.ClassificationRelations ||
                    this.ClassificationRelations != null &&
                    input.ClassificationRelations != null &&
                    this.ClassificationRelations.SequenceEqual(input.ClassificationRelations)
                ) && 
                (
                    this.ChildClassificationReferences == input.ChildClassificationReferences ||
                    this.ChildClassificationReferences != null &&
                    input.ChildClassificationReferences != null &&
                    this.ChildClassificationReferences.SequenceEqual(input.ChildClassificationReferences)
                ) && 
                (
                    this.ActivationDateUtc == input.ActivationDateUtc ||
                    (this.ActivationDateUtc != null &&
                    this.ActivationDateUtc.Equals(input.ActivationDateUtc))
                ) && 
                (
                    this.Code == input.Code ||
                    (this.Code != null &&
                    this.Code.Equals(input.Code))
                ) && 
                (
                    this.CreatorLanguageCode == input.CreatorLanguageCode ||
                    (this.CreatorLanguageCode != null &&
                    this.CreatorLanguageCode.Equals(input.CreatorLanguageCode))
                ) && 
                (
                    this.CountriesOfUse == input.CountriesOfUse ||
                    this.CountriesOfUse != null &&
                    input.CountriesOfUse != null &&
                    this.CountriesOfUse.SequenceEqual(input.CountriesOfUse)
                ) && 
                (
                    this.CountryOfOrigin == input.CountryOfOrigin ||
                    (this.CountryOfOrigin != null &&
                    this.CountryOfOrigin.Equals(input.CountryOfOrigin))
                ) && 
                (
                    this.DeActivationDateUtc == input.DeActivationDateUtc ||
                    (this.DeActivationDateUtc != null &&
                    this.DeActivationDateUtc.Equals(input.DeActivationDateUtc))
                ) && 
                (
                    this.Definition == input.Definition ||
                    (this.Definition != null &&
                    this.Definition.Equals(input.Definition))
                ) && 
                (
                    this.DeprecationExplanation == input.DeprecationExplanation ||
                    (this.DeprecationExplanation != null &&
                    this.DeprecationExplanation.Equals(input.DeprecationExplanation))
                ) && 
                (
                    this.DocumentReference == input.DocumentReference ||
                    (this.DocumentReference != null &&
                    this.DocumentReference.Equals(input.DocumentReference))
                ) && 
                (
                    this.Name == input.Name ||
                    (this.Name != null &&
                    this.Name.Equals(input.Name))
                ) && 
                (
                    this.NamespaceUri == input.NamespaceUri ||
                    (this.NamespaceUri != null &&
                    this.NamespaceUri.Equals(input.NamespaceUri))
                ) && 
                (
                    this.ReplacedObjectCodes == input.ReplacedObjectCodes ||
                    this.ReplacedObjectCodes != null &&
                    input.ReplacedObjectCodes != null &&
                    this.ReplacedObjectCodes.SequenceEqual(input.ReplacedObjectCodes)
                ) && 
                (
                    this.ReplacingObjectCodes == input.ReplacingObjectCodes ||
                    this.ReplacingObjectCodes != null &&
                    input.ReplacingObjectCodes != null &&
                    this.ReplacingObjectCodes.SequenceEqual(input.ReplacingObjectCodes)
                ) && 
                (
                    this.RevisionDateUtc == input.RevisionDateUtc ||
                    (this.RevisionDateUtc != null &&
                    this.RevisionDateUtc.Equals(input.RevisionDateUtc))
                ) && 
                (
                    this.RevisionNumber == input.RevisionNumber ||
                    (this.RevisionNumber != null &&
                    this.RevisionNumber.Equals(input.RevisionNumber))
                ) && 
                (
                    this.Status == input.Status ||
                    (this.Status != null &&
                    this.Status.Equals(input.Status))
                ) && 
                (
                    this.SubdivisionsOfUse == input.SubdivisionsOfUse ||
                    this.SubdivisionsOfUse != null &&
                    input.SubdivisionsOfUse != null &&
                    this.SubdivisionsOfUse.SequenceEqual(input.SubdivisionsOfUse)
                ) && 
                (
                    this.Uid == input.Uid ||
                    (this.Uid != null &&
                    this.Uid.Equals(input.Uid))
                ) && 
                (
                    this.VersionDateUtc == input.VersionDateUtc ||
                    (this.VersionDateUtc != null &&
                    this.VersionDateUtc.Equals(input.VersionDateUtc))
                ) && 
                (
                    this.VersionNumber == input.VersionNumber ||
                    (this.VersionNumber != null &&
                    this.VersionNumber.Equals(input.VersionNumber))
                ) && 
                (
                    this.VisualRepresentationUri == input.VisualRepresentationUri ||
                    (this.VisualRepresentationUri != null &&
                    this.VisualRepresentationUri.Equals(input.VisualRepresentationUri))
                );
        }

        /// <summary>
        /// Gets the hash code
        /// </summary>
        /// <returns>Hash code</returns>
        public override int GetHashCode()
        {
            unchecked // Overflow is fine, just wrap
            {
                int hashCode = 41;
                if (this.Synonyms != null)
                    hashCode = hashCode * 59 + this.Synonyms.GetHashCode();
                if (this.RelatedIfcEntityNames != null)
                    hashCode = hashCode * 59 + this.RelatedIfcEntityNames.GetHashCode();
                if (this.ParentClassificationReference != null)
                    hashCode = hashCode * 59 + this.ParentClassificationReference.GetHashCode();
                if (this.ClassificationProperties != null)
                    hashCode = hashCode * 59 + this.ClassificationProperties.GetHashCode();
                if (this.ClassificationRelations != null)
                    hashCode = hashCode * 59 + this.ClassificationRelations.GetHashCode();
                if (this.ChildClassificationReferences != null)
                    hashCode = hashCode * 59 + this.ChildClassificationReferences.GetHashCode();
                if (this.ActivationDateUtc != null)
                    hashCode = hashCode * 59 + this.ActivationDateUtc.GetHashCode();
                if (this.Code != null)
                    hashCode = hashCode * 59 + this.Code.GetHashCode();
                if (this.CreatorLanguageCode != null)
                    hashCode = hashCode * 59 + this.CreatorLanguageCode.GetHashCode();
                if (this.CountriesOfUse != null)
                    hashCode = hashCode * 59 + this.CountriesOfUse.GetHashCode();
                if (this.CountryOfOrigin != null)
                    hashCode = hashCode * 59 + this.CountryOfOrigin.GetHashCode();
                if (this.DeActivationDateUtc != null)
                    hashCode = hashCode * 59 + this.DeActivationDateUtc.GetHashCode();
                if (this.Definition != null)
                    hashCode = hashCode * 59 + this.Definition.GetHashCode();
                if (this.DeprecationExplanation != null)
                    hashCode = hashCode * 59 + this.DeprecationExplanation.GetHashCode();
                if (this.DocumentReference != null)
                    hashCode = hashCode * 59 + this.DocumentReference.GetHashCode();
                if (this.Name != null)
                    hashCode = hashCode * 59 + this.Name.GetHashCode();
                if (this.NamespaceUri != null)
                    hashCode = hashCode * 59 + this.NamespaceUri.GetHashCode();
                if (this.ReplacedObjectCodes != null)
                    hashCode = hashCode * 59 + this.ReplacedObjectCodes.GetHashCode();
                if (this.ReplacingObjectCodes != null)
                    hashCode = hashCode * 59 + this.ReplacingObjectCodes.GetHashCode();
                if (this.RevisionDateUtc != null)
                    hashCode = hashCode * 59 + this.RevisionDateUtc.GetHashCode();
                if (this.RevisionNumber != null)
                    hashCode = hashCode * 59 + this.RevisionNumber.GetHashCode();
                if (this.Status != null)
                    hashCode = hashCode * 59 + this.Status.GetHashCode();
                if (this.SubdivisionsOfUse != null)
                    hashCode = hashCode * 59 + this.SubdivisionsOfUse.GetHashCode();
                if (this.Uid != null)
                    hashCode = hashCode * 59 + this.Uid.GetHashCode();
                if (this.VersionDateUtc != null)
                    hashCode = hashCode * 59 + this.VersionDateUtc.GetHashCode();
                if (this.VersionNumber != null)
                    hashCode = hashCode * 59 + this.VersionNumber.GetHashCode();
                if (this.VisualRepresentationUri != null)
                    hashCode = hashCode * 59 + this.VisualRepresentationUri.GetHashCode();
                return hashCode;
            }
        }

        /// <summary>
        /// To validate all properties of the instance
        /// </summary>
        /// <param name="validationContext">Validation context</param>
        /// <returns>Validation Result</returns>
        IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }
}
