首页 > 其他分享 >实体类(多层嵌套)生成FastReport需要的frd字典文件

实体类(多层嵌套)生成FastReport需要的frd字典文件

时间:2023-12-04 11:34:43浏览次数:40  
标签:stringTouBu 实体类 string frd AppendLine FastReport item PropertyType var

 #region 根据模型生成FastReport需要的Frd字典文件
        /// <summary>
        /// 生成frd文件内容
        /// </summary>
        private static StringBuilder stringTouBu = new StringBuilder();

        /// <summary>
        /// 根据模型生成FastReport需要的Frd字典文件
        /// </summary>
        /// <param name="model">实体模型</param>
        /// <param name="path">生成的frd存放的路径(后面不要带\)</param>
        /// <param name="bindName">FastReport数据绑定名称,默认取实体模型名称</param>
        /// <returns></returns>
        /// <remarks>
        /// Request by OP需要用FastReport Reponse by Smile 2022-08-03
        /// </remarks>
        public static string GenerateFRD<T>(this T model, string path, string bindName = null)
        {
            var t = model.GetType();
            var properties = t.GetProperties();

            stringTouBu.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            stringTouBu.AppendLine("<Dictionary>");
            stringTouBu.AppendLine($"<BusinessObjectDataSource Name=\"{bindName ?? t.Name}\" ReferenceName=\"{bindName ?? t.Name}\" DataType=\"System.Int32\" Enabled=\"true\">");

            foreach (var item in properties)
            {
                var name = item.Name;
                var type = item.PropertyType.Name;
                var isClass = item.PropertyType.IsClass;//获取一个值,该值指示 System.Type 是类还是委托; 也就是说,不是值类型或接口。
                var isGenericType = item.PropertyType.IsGenericType;//获取一个值,该值指示当前类型是否为泛型类型。
                var fullName = item.PropertyType.FullName;
                //                   表示实体模型                              表示数组
                if ((type != "String" && isClass && !isGenericType) || (isClass && isGenericType))
                {
                    GenerateType(item.PropertyType, name);
                }
                else
                {
                    stringTouBu.AppendLine($"<Column Name=\"{name}\" DataType=\"{GetType(type, fullName)}\" PropName=\"Column\"/>");
                }
            }
            stringTouBu.AppendLine("</BusinessObjectDataSource>");
            stringTouBu.AppendLine("</Dictionary>");

            string filePath = $"{path}\\{bindName ?? t.Name}.frd";
            if (!File.Exists(filePath))
            {
                File.Create(filePath);
            }
            System.IO.File.WriteAllText(filePath, stringTouBu.ToString());

            return stringTouBu.ToString();
        }

        /// <summary>
        /// 递归获取多层嵌套的模型
        /// </summary>
        /// <param name="t">模型(单个模型或者数组)</param>
        /// <param name="bindName">数据源绑定的名称</param>
        /// <returns></returns>
        private static void GenerateType(Type t, string bindName)
        {
            stringTouBu.AppendLine($"<BusinessObjectDataSource Name=\"{bindName}\" ReferenceName=\"{bindName}\" DataType=\"System.Int32\" Enabled=\"true\">");

            var count = t.GenericTypeArguments.Length;
            var properties = count > 0 ? t.GenericTypeArguments[0].GetProperties() : t.GetProperties();
            foreach (var item in properties)
            {
                var name = item.Name;
                var type = item.PropertyType.Name;
                var isClass = item.PropertyType.IsClass;//获取一个值,该值指示 System.Type 是类还是委托; 也就是说,不是值类型或接口。
                var isGenericType = item.PropertyType.IsGenericType;//获取一个值,该值指示当前类型是否为泛型类型。
                var fullName = item.PropertyType.FullName;
                //                   表示实体模型                              表示数组
                if ((type != "String" && isClass && !isGenericType) || (isClass && isGenericType))
                {
                    GenerateType(item.PropertyType, name);
                }
                else
                {
                    stringTouBu.AppendLine($"<Column Name=\"{name}\" DataType=\"{GetType(type, fullName)}\" PropName=\"Column\"/>");
                }
            }
            stringTouBu.AppendLine("</BusinessObjectDataSource>");
        }

        /// <summary>
        /// 获取数据类型空间
        /// </summary>
        /// <param name="type">原始type类型</param>
        /// <param name="fullName"></param>
        /// <returns></returns>
        private static string GetType(string type, string fullName)
        {
            //判断值类型是否可为空 System.Nullable`1 固定的命名空间
            if (type == "Nullable`1")
            {
                //可为空则获取不为空的命名类型
                return fullName.Replace("System.Nullable`1[[", "").Replace("]]", "").Split(',')[0];
            }
            return fullName;
        } 
        #endregion

 

标签:stringTouBu,实体类,string,frd,AppendLine,FastReport,item,PropertyType,var
From: https://www.cnblogs.com/smile-live/p/16547890.html

相关文章

  • 使用FastReport类库实现zebra斑马打印机的简单操作
    使用FastReport类库实现zebra斑马打印机的简单操作1.首先引入需要的类库  2.需要提前通过fastreport制作一个模板,并制定一些需要替换的变量这个套路的原理就是替换模板中的变量数据,达到输出不同的内容,如果没有替换,变量默认是空白的内容关于模板制作方面后续会在分享 ......
  • .net core 6 由数据库生成对应实体类
    首先按照网上其他朋友的教程,安装对应程序包 然后在程序包管理器控制台中执行Scaffold-DbContext,总是报错,各种各样的错误,说未引用的程序包之类的。最后找到的解决办法是,在vs的菜单栏中找到视图--终端,然后在下方弹出的“开发者PowerShell”中输入命令 dotnetefdbcontexts......
  • java读取照片Exif信息到实体类
    前言1.总共读出来了228个参数信息,但是我挑选了36个我认为比较有价值的参数,弄成了实体类(其实是因为很多参数我看不明白是啥意思)2.为了方便,所以实体类里我直接用中文字段了效果图导入依赖<!--读取照片元信息--><dependency><groupId>com.dre......
  • 将实体类输出为指定格式(包含下划线,驼峰,大小写)
    一般的实体类字段命名规则基于驼峰命名规则,但是有时候需要调用实体类,需要返回指定的格式。如大小写、字母加下划线等格式。可以使用以下方法,快速生成指定的格式:(该项目为Springboot项目)准备一个实体类:@DatapublicclassTest{privateStringname;privateStri......
  • (07)FastReport书码ISBN的添加显示
    ApplicationError---------------------------ExceptionEClassNotFoundinmoduleProject12.exeat000652EE.ClassTfrxBarCodeViewnotfound.0]出现这个错, 是没有增加这个控件frxBarCodeObject 1]双击 frxReport1 拖一个obCatBarCode的EAN13到右边97875125040......
  • 关于两个实体类之间相同字段的赋值
    1.可以使用以下方法:BeanUtils.copyProperties(one,two)2.相关依赖:<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>number</version><!--替换为正确的版本号-->可以是:1.9......
  • FastReport打印DataBand分列:DataBand.Columns.Count
    FastReport打印DataBand分列,DataBand.Columns.Count。看图,转载请注明海宏软件:下面的图片:diffImg、pltImg、rbcImg实际上是三行记录,横着打印了。 C#下载网页文件并存入DataTable的DataRow的DataColumn字段里:if(web==null)web=newWebClient();row["oImg"]=web.Down......
  • 一文带你掌握JPA实体类注解
    一文带你掌握JPA实体类注解−目录基本注解@Entity@Table@Basic(未加注解的默认注解)@Transient@Column@Id@GeneratedValue@GenericGenerator其他注解@Enumerated@Temporal@DynamicInsert、@DynamicUpdate@Access复合主键@EmbeddedId+@Embeddable@IdClass@Embedded+@Attribut......
  • 报表ReportMachine与FastReport固定行数分页不足补空白行实践
    ReportMachine与FastReport固定行数分页不足补空白行实践ReportMachine简单容易,FastReport有点复杂准备工作ReportMachine实现ReportMachine实现很简单,设置报表MasterData的LinesPerPage每页记录数,AutoAppendBlank为True即可。效果FastReport实现需在在报表里使用代码来控制才能实......
  • FastReport 导出Excel、Word、Pdf
    privatevoidExportPDF(H_HistoryDataModelmodel){try{//createreportinstanceReportreport=newReport();PrepareReport(report,model);//createexpor......