static void GetTableAttrInfo(System.Reflection.Assembly assembly) { foreach (var type in assembly.GetTypes()) { var entityAttrs = type.GetCustomAttributes <TableEntityAttribute>(false); foreach (var attr in entityAttrs) { var entityInfo = new TableEntityInfo { EntityType = type, Attribute = attr }; cachedEntityInfos.Add(entityInfo); } var assetAttrs = type.GetCustomAttributes <TableAssetAttribute>(false); foreach (var attr in assetAttrs) { var assetInfo = new TableAssetInfo { AssetType = type, Attribute = attr }; cachedAssetInfos.Add(assetInfo); } } }
static void LoadTableData(TableAssetInfo info) { string assetPath = ""; string assetName = info.AssetType.Name + ".asset"; assetPath = Path.Combine(info.Attribute.AssetPath, assetName); UnityEngine.Object asset = LoadOrCreateAsset(assetPath, info.AssetType); var assetFields = info.AssetType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); IWorkbook book = LoadBook(info.Attribute.ExcelPath); // Get filed and type infomation Type fieldType = assetFields[0].FieldType; if (!fieldType.IsGenericType || (fieldType.GetGenericTypeDefinition() != typeof(List <>))) { return; } Type entityType = fieldType.GetGenericArguments()[0]; Type listType = typeof(List <>).MakeGenericType(entityType); MethodInfo listAddMethod = listType.GetMethod("Add", new Type[] { entityType }); // Read data from table object list = Activator.CreateInstance(listType); for (int i = 0; i < book.NumberOfSheets; ++i) { ISheet sheet = book.GetSheetAt(i); if (sheet == null) { continue; } GetEntityListFromSheet(sheet, entityType, list, listAddMethod); } assetFields[0].SetValue(asset, list); if (info.Attribute.LogOnImport) { Debug.Log(string.Format("Imported {0} sheets form {1}.", book.NumberOfSheets, info.Attribute.ExcelPath)); } EditorUtility.SetDirty(asset); }