public static List <IFilter> CreateFilters <TTemplate>(ExcelHeaderRow headerRow)
        {
            Type templateType = typeof(TTemplate);
            var  key          = templateType;

            if (Table[key] != null)
            {
                return((List <IFilter>)Table[key]);
            }

            List <IFilter>             filters        = new List <IFilter>();
            List <BaseFilterAttribute> attrs          = new List <BaseFilterAttribute>();
            TypeFilterInfo             typeFilterInfo = TypeFilterInfoFlyweight.CreateInstance(typeof(TTemplate), headerRow);

            typeFilterInfo.PropertyFilterInfos.ForEach(a => a.FilterAttrs.ForEach(f => attrs.Add(f)));

            attrs.Distinct(new FilterAttributeComparer()).ToList().ForEach
                (a =>
            {
                var filter = FilterFactory.CreateInstance(a.GetType());
                if (filter != null)
                {
                    filters.Add(filter);
                }
            });

            Table[key] = filters;
            return(filters);
        }
        /// <summary>
        /// 导入
        /// </summary>
        /// <typeparam name="T">模板类</typeparam>
        /// <param name="fileUrl">Excel文件绝对地址</param>
        /// <param name="delegateNotExistInDatabase">数据库校验委托,标记了数据库重复校验特性则必填</param>
        /// <returns></returns>
        public static List <ExcelDataRow> Validate <T>(string fileUrl, Func <DatabaseFilterContext, bool> delegateNotExistInDatabase = null)
            where T : class, new()
        {
            Init(fileUrl);

            List <ExcelDataRow> rows      = ExcelConverter.Convert <T>(Sheet, HeaderRow, 1);
            AndFilter           andFilter = new AndFilter()
            {
                filters = FiltersFlyWeight.CreateFilters <T>(HeaderRow)
            };

            FilterContext context = new FilterContext()
            {
                DelegateNotExistInDatabase = delegateNotExistInDatabase,
                TypeFilterInfo             = TypeFilterInfoFlyweight.CreateInstance(typeof(T), HeaderRow)
            };

            rows = andFilter.Filter(rows, context);

            return(rows);
        }