public PropertySet( IPropertySet other, IListener listener, IPolicies policies, ICompilerMessageBuilder messageProvider, int interfaceIndex) { if(ReferenceEquals(other, null)) throw new ArgumentNullException(nameof(other)); if (ReferenceEquals(listener, null)) throw new ArgumentNullException(nameof(listener)); if (ReferenceEquals(policies, null)) throw new ArgumentNullException(nameof(policies)); if (ReferenceEquals(messageProvider, null)) throw new ArgumentNullException(nameof(messageProvider)); this.InterfaceName = other.InterfaceName ?? policies.GenerateSurrogateInterfaceName(interfaceIndex); if (ReferenceEquals(other.InterfaceName, null)) listener.Error(messageProvider.MissingInterfaceName(this.InterfaceName, interfaceIndex)); if (false == policies.IsValidInterfaceName(this.InterfaceName)) listener.Error(messageProvider.InvalidInterfaceName(this.InterfaceName, interfaceIndex)); if (ReferenceEquals(other.Properties, null)) { listener.Error(messageProvider.EmptyPropertiesList(this.InterfaceName, interfaceIndex)); return; } int propertyIndex = 0; foreach (var property in other.Properties.OfType<IBasicProperty>()) { this.Properties.Add( new BasicProperty(property, listener, policies, messageProvider, propertyIndex++)); } propertyIndex = 0; foreach (var property in other.Properties.OfType<IBlobProperty>()) { this.Properties.Add( new BlobProperty(property, listener, policies, messageProvider, propertyIndex++)); } propertyIndex = 0; foreach (var property in other.Properties.OfType<ITableValueProperty>()) { this.Properties.Add( new TableValueProperty(property, listener, policies, messageProvider, propertyIndex++)); } this.m_ixPropertyByName = this.Properties.ToDictionary( p => p.PropertyName, StringComparer.OrdinalIgnoreCase); }