/// <summary>
 /// Meetses the filter.
 /// </summary>
 /// <param name="boolPropertyValue">if set to <c>true</c> [bool property value].</param>
 /// <param name="filterFactor">The filter factor.</param>
 /// <param name="filterCriteria">The filter criteria.</param>
 /// <returns></returns>
 private static bool MeetsFilter(bool boolPropertyValue, TypeKindFilter filterFactor, TypeKindFilter filterCriteria)
 {
     return(filterCriteria == TypeKindFilter.Any || //No need to filter
            (filterCriteria & filterFactor) == 0 || //Not hit the factor to filter
            boolPropertyValue);
 }
        /// <summary>
        /// Gets the type with specific attribute.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="isInherit">if set to <c>true</c> [is inherit].</param>
        /// <param name="filter">The filter.</param>
        /// <returns></returns>
        public static List <Type> GetTypeWithSpecificAttribute <T>(bool isInherit = false, TypeKindFilter filter = TypeKindFilter.Any) where T : Attribute
        {
            HashSet <Type> result = new HashSet <Type>();

            foreach (var item in EnvironmentCore.DescendingAssemblyDependencyChain)
            {
                foreach (var one in item.GetTypes())
                {
                    if (MeetsFilter(one.IsClass, TypeKindFilter.IsClass, filter) &&
                        MeetsFilter(one.IsInterface, TypeKindFilter.IsInterface, filter) &&
                        MeetsFilter(one.IsPrimitive, TypeKindFilter.IsPrimitive, filter) &&
                        MeetsFilter(one.IsPublic, TypeKindFilter.IsPublic, filter) &&
                        MeetsFilter(one.IsValueType, TypeKindFilter.IsValueType, filter) &&
                        one.GetCustomAttribute <T>(isInherit) != null)
                    {
                        result.Add(one);
                    }
                }
            }

            return(result.ToList());
        }