using System; using System.Collections.Generic; using System.Linq; using System.Text; //引用反射 using System.Reflection; namespace CoderEngine { /// /// 临时存储遍历出来的类型描述 /// public class TypeMode { /// /// 字段名称 /// public Type MemberType { get; set; } /// /// 类型名称 /// public string Name { get; set; } /// /// 是否有嵌套下级 /// public int IsHaveSou = 0; /// /// 嵌套类型 如果有包裹下级类型的话 则不为空 Null /// public List TypeList = null; /// /// 下级参数类型 /// public Type DownParamType { get; set; } /// /// 下级参数名称 /// public string DownParamName { get; set; } } /// /// 模型读取 /// public class _ModleReader { public TypeMode TopType = new TypeMode(); /// /// 检查程序及下的实体类 /// /// 程序集名称 /// ModelClass类型名称 /// public TypeMode ModelCheck(string _AssemblyName, string _TypeName) { //Console.WriteLine(""); //Console.WriteLine("====== C# 数据模型转Java实体类代码实现 ======"); //Console.WriteLine(""); //Console.WriteLine("读取程序集" + _AssemblyName + "下实体类" + _TypeName + ""); //取得类型 Type PerentType = Assembly.Load(_AssemblyName).GetType(_AssemblyName + "." + _TypeName); if (PerentType == null) { //Console.WriteLine("读取程序集或类不存在"); } //Console.WriteLine("已成功反射获取程序集"); TopType.MemberType = PerentType; //Console.WriteLine("对象类型:"+ TopType.MemberType); TopType.Name = PerentType.Name; //Console.WriteLine("对象名称:" + TopType.Name); //获取下级属性 TopType.TypeList = ReadModel(PerentType); //} return TopType; } /// /// 读取类型 /// /// public List ReadModel(Type PerentType) { //Console.WriteLine("对" + TopType.Name + "进行详细处理"); //获取属性 PropertyInfo[] Plist = PerentType.GetProperties(); List TypeList = new List(); //Console.WriteLine("遍历"+ TopType.Name + "属性: 属性数量为"+ Plist.Count()); foreach (var m in Plist) { TypeMode TM = new TypeMode(); TM.Name = m.Name; //Console.WriteLine("----" + TopType.Name + "下属性名:" + TM.Name); TM.MemberType = m.PropertyType; //Console.WriteLine("----" + TopType.Name + "下属性" + TM.Name + " 类型为" + TM.MemberType.Name + "完整类型名" + TM.MemberType.Name); //如果是List类型 则往下解析 if (TM.MemberType.Name == "List`1") { //注意:这里需要考虑排除无限极自我嵌套实体类型 否则出现死循环 //暂未处理 //TM.MemberType.Name的FullName的值为 "System.Collections.Generic.List`1[[ --集合内嵌类型名称--, CoderEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" //其中包含内嵌List的名称 我们要将其取出 得到的值例如 “程序集.*.*类型” var SonParamName = TM.MemberType.FullName.Substring(TM.MemberType.FullName.IndexOf("[") + 2); SonParamName = SonParamName.Substring(0, SonParamName.IndexOf(",")); //取出集合内子类型所属的程序集名字 string SonParamFromAssemblyName = SonParamName.Substring(0,SonParamName.IndexOf('.')); //反射载入子类型的类型 Type SonType = Assembly.Load(SonParamFromAssemblyName).GetType(SonParamName); TM.IsHaveSou = 1; TM.DownParamType = SonType; TM.DownParamName = SonType.Name; //Console.WriteLine("----对" + TopType.Name + "下属性" + TM.Name + " 嵌套泛型进行处理"); TM.TypeList = ReadModel(SonType); } TypeList.Add(TM); } return TypeList; } } }