public IEnumerable <IMessageInterfaceType> GetMessageTypes()
        {
            if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(IConsumer <>))
            {
                var interfaceType = new ConsumerInterfaceType(typeof(T).GetGenericArguments()[0], typeof(T));
                if (interfaceType.MessageType.IsValueType == false && interfaceType.MessageType != typeof(string))
                {
                    yield return(interfaceType);
                }
            }

            IEnumerable <IMessageInterfaceType> types = typeof(T).GetInterfaces()
                                                        .Where(x => x.IsGenericType)
                                                        .Where(x => x.GetGenericTypeDefinition() == typeof(IConsumer <>))
                                                        .Select(x => new ConsumerInterfaceType(x.GetGenericArguments()[0], typeof(T)))
                                                        .Where(x => x.MessageType.IsValueType == false && x.MessageType != typeof(string));

            foreach (IMessageInterfaceType type in types)
            {
                yield return(type);
            }
        }
        public IEnumerable <IMessageInterfaceType> GetMessageTypes()
        {
            var typeInfo = typeof(T).GetTypeInfo();

            if (typeInfo.IsGenericType && typeInfo.GetGenericTypeDefinition() == typeof(IConsumer <>))
            {
                var interfaceType = new ConsumerInterfaceType(typeof(T).GetGenericArguments()[0], typeof(T));
                if (TypeMetadataCache.IsValidMessageType(interfaceType.MessageType))
                {
                    yield return(interfaceType);
                }
            }

            IEnumerable <IMessageInterfaceType> types = typeof(T).GetInterfaces()
                                                        .Where(x => x.GetTypeInfo().IsGenericType)
                                                        .Where(x => x.GetGenericTypeDefinition() == typeof(IConsumer <>))
                                                        .Select(x => new ConsumerInterfaceType(x.GetGenericArguments()[0], typeof(T)))
                                                        .Where(x => TypeMetadataCache.IsValidMessageType(x.MessageType));

            foreach (var type in types)
            {
                yield return(type);
            }
        }