/// <summary>
        /// Verifica se è presente un attributo di tipo stringa e ne restituisce il valore
        /// </summary>
        /// <param name="attributes">Lista attributi</param>
        /// <param name="attributeName">Attributo da ricercare</param>
        /// <param name="containerType">Tipo di dato</param>
        /// <param name="attributeValue">Valore estratto dall'attributo</param>
        /// <returns>Se l'attributo è presente e con un valore valido</returns>
        public static bool TryGetActiveAttribute <T>(this List <AttributeValueContainer> attributes, string attributeName,
                                                     ValueContainerType containerType,
                                                     out T attributeValue)
        {
            attributeValue = default(T);

            if (attributes == null ||
                string.IsNullOrWhiteSpace(attributeName))
            {
                return(false);
            }

            var attribute = attributes.FirstOrDefault(a => a.Name == attributeName);

            if (attribute == null)
            {
                return(false);
            }

            var isValid = attribute.IsValid &&
                          attribute.Type == containerType &&
                          attribute.TryConvertValueToType(out attributeValue);

            return(isValid);
        }
        /// <summary>
        /// Restituisce il valore di un attributo, oppure il default
        /// del tipo richiesto se non presente o in caso di qualsiasi errore
        /// </summary>
        /// <typeparam name="T">Tipo del dato richiesto</typeparam>
        /// <param name="attributes">Lista attributi</param>
        /// <param name="attributeName">Attributo da ricercare</param>
        /// <param name="containerType">Tipo del contenitore dati da cercare</param>
        /// <returns>Valore dell'attributo o default del suo tipo</returns>
        public static T GetActiveAttributeValueOrDefault <T>(this List <AttributeValueContainer> attributes, string attributeName,
                                                             ValueContainerType containerType)
        {
            T attributeValue;

            var isValid = attributes.TryGetActiveAttribute(attributeName, containerType, out attributeValue);

            return(isValid
                       ? attributeValue
                       : default(T));
        }
        /// <summary>
        /// Verifica se è presente un attributo di tipo stringa e ne restituisce il valore
        /// </summary>
        /// <param name="endPoint">EndPoint di cui valutare gli attributi</param>
        /// <param name="attributeName">Attributo da ricercare</param>
        /// <param name="containerType">Tipo di dato</param>
        /// <param name="attributeValue">Valore estratto dall'attributo</param>
        /// <returns>Se l'attributo è presente e con un valore valido</returns>
        public static bool TryGetEndPointActiveAttribute <T>(this IDncEndPoint endPoint, string attributeName,
                                                             ValueContainerType containerType,
                                                             out T attributeValue)
        {
            attributeValue = default(T);

            if (endPoint == null)
            {
                return(false);
            }

            var channel = endPoint.GetChannel();

            if (channel == null)
            {
                return(false);
            }

            var attributes = channel.Settings.Customization.Attributes;

            if (attributes == null)
            {
                return(false);
            }

            if (attributes == null ||
                string.IsNullOrWhiteSpace(attributeName))
            {
                return(false);
            }

            var attribute = attributes.FirstOrDefault(a => a.Name == attributeName);

            if (attribute == null)
            {
                return(false);
            }

            var isValid = attribute.IsValid &&
                          attribute.Type == containerType &&
                          attribute.TryConvertValueToType(out attributeValue);

            return(isValid);
        }