public static void LoadFromTab(Type type, ref CBaseInfo newT, ICTabReadble tabFile, int row) { CBase.Assert(typeof(CBaseInfo).IsAssignableFrom(type)); FieldInfo[] fields = type.GetFields(); foreach (FieldInfo field in fields) { if (!tabFile.HasColumn(field.Name)) { CBase.LogError("表{0} 找不到表头{1}", type.Name, field.Name); continue; } object value; if (field.FieldType == typeof(int)) { value = tabFile.GetInteger(row, field.Name); } else if (field.FieldType == typeof(long)) { value = (long)tabFile.GetInteger(row, field.Name); } else if (field.FieldType == typeof(string)) { value = tabFile.GetString(row, field.Name); } else if (field.FieldType == typeof(float)) { value = tabFile.GetFloat(row, field.Name); } else if (field.FieldType == typeof(bool)) { value = tabFile.GetBool(row, field.Name); } else if (field.FieldType == typeof(double)) { value = tabFile.GetDouble(row, field.Name); } else if (field.FieldType == typeof(uint)) { value = tabFile.GetUInteger(row, field.Name); } else if (field.FieldType == typeof(List <string>)) { string sz = tabFile.GetString(row, field.Name); value = CTool.Split <string>(sz, '|'); } else if (field.FieldType == typeof(List <int>)) { List <int> retInt = new List <int>(); string szArr = tabFile.GetString(row, field.Name); if (!string.IsNullOrEmpty(szArr)) { string[] szIntArr = szArr.Split('|'); foreach (string szInt in szIntArr) { float parseFloat; float.TryParse(szInt, out parseFloat); int parseInt_ = (int)parseFloat; retInt.Add(parseInt_); } value = retInt; } else { value = new List <int>(); } } else if (field.FieldType == typeof(List <List <string> >)) { string sz = tabFile.GetString(row, field.Name); if (!string.IsNullOrEmpty(sz)) { var szOneList = new List <List <string> >(); string[] szArr = sz.Split('|'); foreach (string szOne in szArr) { string[] szOneArr = szOne.Split('-'); szOneList.Add(new List <string>(szOneArr)); } value = szOneList; } else { value = new List <List <string> >(); } } else if (field.FieldType == typeof(List <List <int> >)) { string sz = tabFile.GetString(row, field.Name); if (!string.IsNullOrEmpty(sz)) { var zsOneIntList = new List <List <int> >(); string[] szArr = sz.Split('|'); foreach (string szOne in szArr) { List <int> retInts = new List <int>(); string[] szOneArr = szOne.Split('-'); foreach (string szOneInt in szOneArr) { float parseFloat; float.TryParse(szOneInt, out parseFloat); int parseInt_ = (int)parseFloat; retInts.Add(parseInt_); } zsOneIntList.Add(retInts); } value = zsOneIntList; } else { value = new List <List <int> >(); } } else { CBase.LogWarning("未知类型: {0}", field.Name); value = null; } if (field.Name == "Id") // 如果是Id主键,确保数字成整数!不是浮点数 因为excel转tab可能转成浮点 { float fValue; if (float.TryParse((string)value, out fValue)) { try { value = ((int)fValue).ToString(); } catch { CBase.LogError("转型错误...{0}", value.ToString()); } } } field.SetValue(newT, value); } }
public void ReadFromTab(Type type, ref CBaseInfo newT, ICTabReadble tabFile, int row) { if (Debug.isDebugBuild) { CDebug.Assert(typeof(CBaseInfo).IsAssignableFrom(type)); } // 缓存字段Field, 每个Type只反射一次! LinkedList <FieldInfo> okFields; if (!CacheTypeFields.TryGetValue(type, out okFields)) { okFields = CacheTypeFields[type] = new LinkedList <FieldInfo>(); var allFields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo field in allFields) { if (field.Name.StartsWith("_") || field.IsInitOnly) // 筛掉_ 和 readonly { continue; } if (!tabFile.HasColumn(field.Name)) { if (Debug.isDebugBuild) { CDebug.LogError("表{0} 找不到表头{1}", type.Name, field.Name); } continue; } okFields.AddLast(field); } } // 读字段 foreach (var field in okFields) { var fieldName = field.Name; var fieldType = field.FieldType; object value; if (fieldType == typeof(int)) { value = tabFile.GetInteger(row, fieldName); } else if (fieldType == typeof(long)) { value = (long)tabFile.GetInteger(row, fieldName); } else if (fieldType == typeof(string)) { value = tabFile.GetString(row, fieldName).Replace("\\n", "\n"); } else if (fieldType == typeof(float)) { value = tabFile.GetFloat(row, fieldName); } else if (fieldType == typeof(bool)) { value = tabFile.GetBool(row, fieldName); } else if (fieldType == typeof(double)) { value = tabFile.GetDouble(row, fieldName); } else if (fieldType == typeof(uint)) { value = tabFile.GetUInteger(row, fieldName); } else if (fieldType == typeof(Regex)) { var str = tabFile.GetString(row, fieldName); value = string.IsNullOrEmpty(str) ? null : new Regex(str); } else if (fieldType == typeof(List <string>)) { string sz = tabFile.GetString(row, fieldName); value = CTool.Split <string>(sz, '|'); } else if (fieldType == typeof(List <int>)) { //List<int> retInt = new List<int>(); string szArr = tabFile.GetString(row, fieldName); value = CTool.Split <int>(szArr, '|'); //if (!string.IsNullOrEmpty(szArr)) //{ // string[] szIntArr = szArr.Split('|'); // foreach (string szInt in szIntArr) // { // float parseFloat; // float.TryParse(szInt, out parseFloat); // int parseInt_ = (int)parseFloat; // retInt.Add(parseInt_); // } //} //else // value = new List<int>(); } else if (fieldType == typeof(List <List <string> >)) { string sz = tabFile.GetString(row, fieldName); if (!string.IsNullOrEmpty(sz)) { var szOneList = new List <List <string> >(); string[] szArr = sz.Split('|'); foreach (string szOne in szArr) { string[] szOneArr = szOne.Split('-', ':'); szOneList.Add(new List <string>(szOneArr)); } value = szOneList; } else { value = new List <List <string> >(); } } else if (fieldType == typeof(List <List <int> >)) { string sz = tabFile.GetString(row, fieldName); if (!string.IsNullOrEmpty(sz)) { var zsOneIntList = new List <List <int> >(); string[] szArr = sz.Split('|'); foreach (string szOne in szArr) { List <int> retInts = new List <int>(); string[] szOneArr = szOne.Split('-', ':'); foreach (string szOneInt in szOneArr) { float parseFloat; float.TryParse(szOneInt, out parseFloat); int parseInt_ = (int)parseFloat; retInts.Add(parseInt_); } zsOneIntList.Add(retInts); } value = zsOneIntList; } else { value = new List <List <int> >(); } } else if (fieldType == typeof(JsonObject)) { string sz = tabFile.GetString(row, fieldName); value = string.IsNullOrEmpty(sz) ? new JsonObject() : CTool.SplitToJson(sz); } else { CDebug.LogWarning("未知类型: {0}", fieldName); value = null; } if (fieldName == "Id") // 如果是Id主键,确保数字成整数! { int fValue; if (int.TryParse((string)value, out fValue)) { try { value = fValue.ToString(); } catch { CDebug.LogError("转型错误...{0}", value.ToString()); } } } field.SetValue(newT, value); } }