Пример #1
0
    public static CBaseInfo LoadFromTab(Type type, ICTabReadble tabFile, int row)
    {
        CBaseInfo newT = Activator.CreateInstance(type) as CBaseInfo;

        LoadFromTab(type, ref newT, tabFile, row);
        return(newT);
    }
Пример #2
0
    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);
        }
    }
Пример #3
0
    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);
        }
    }
Пример #4
0
 /// <summary>
 /// 可自定义对表进行附加解释.... 在Parse执行前...
 /// tabFile后边会被释放掉
 /// </summary>
 /// <param name="tabFile"></param>
 public virtual void CustomReadLine(ICTabReadble tabFile, int row)
 {
 }