public static MethodGenerationData GenerateLoadMethod(List <PlayerDataEditorData> datas, string category)
        {
            List <string> bodyStatement = new List <string>();

            for (int i = 0; i < datas.Count; i++)
            {
                bool usesReactiveProperty = PlayerDataCodeGeneratorUtility.UsesReactiveProperty(datas[i].baseDataType);
                // Example: _playerData.Set_TestInt(_playerDataManager.TryLoad<int>(PlayerDataKeys.INT_TEST_INT))
                string defaultValue         = "default";
                bool   isVariableCollection = VariableTypeCheckerUtility.IsVariableCollection(datas[i].baseDataType);
                bool   IsVariableDictionary = VariableTypeCheckerUtility.IsVariableDictionary(datas[i].baseDataType);

                string baseFormat = "{0}.{1} = {2}.TryLoad<{3}>({4}.{5}, {6}, {7});";
                string loadType   = datas[i].baseDataType;

                if (isVariableCollection)
                {
                    defaultValue = $"new {datas[i].baseDataType}<{datas[i].valueDataType}>()";
                    baseFormat   = "{0}.{1} = new " + ReactivePropertyEditorUtility.CreateReactivePropertyType(datas[i]) + "({2}.TryLoad<{3}>({4}.{5}, {6}, {7}));";
                    loadType     = $"{datas[i].baseDataType}<{datas[i].valueDataType}>";
                }
                else if (IsVariableDictionary)
                {
                    defaultValue = $"new {datas[i].baseDataType}<{datas[i].keyDataType}, {datas[i].valueDataType}>()";
                    baseFormat   = "{0}.{1} = new " + ReactivePropertyEditorUtility.CreateReactivePropertyType(datas[i]) + "({2}.TryLoad<{3}>({4}.{5}, {6}, {7}));";
                    loadType     = $"{datas[i].baseDataType}<{datas[i].keyDataType},{datas[i].valueDataType}>";
                }

                bodyStatement.Add(string.Format(baseFormat,
                                                PlayerDataCodeGeneratorConstants.PLAYER_DATA_REFERENCE_NAME,
                                                usesReactiveProperty ? datas[i].key.ToCamelCase(false) : datas[i].key.ToCamelCase(false) + ".Value",
                                                PlayerDataCodeGeneratorConstants.PLAYER_DATA_MANAGER_REFERENCE_NAME,
                                                loadType,
                                                PlayerDataCodeGeneratorConstants.PLAYER_DATA_KEYS_CLASS_NAME,
                                                datas[i].key, defaultValue, datas[i].isLocalOnly.ToString().ToLower()));
            }

            return(new MethodGenerationData
            {
                m_MethodName = PlayerDataCodeGeneratorConstants.LOADER_METHOD_NAME + category,
                m_MethodReturnType = "void",
                m_MethodBodyStatements = bodyStatement
            });
        }
        public static MethodGenerationData GeneratePlayerDataKeyValueGetterMethod(List <PlayerDataEditorData> datas, string category)
        {
            List <string> statements = new List <string>();

            foreach (var data in datas)
            {
                bool useReactiveProperty = PlayerDataCodeGeneratorUtility.UsesReactiveProperty(data.baseDataType);
                // dictionary[PlayerDataKeys.INT_TEST_INT] = () => _playerDataGetter.GetValue_TestInt();
                statements.Add(string.Format("getterMap[{0}.{1}] = () => {2}.{3}{4}();",
                                             PlayerDataCodeGeneratorConstants.PLAYER_DATA_KEYS_CLASS_NAME,
                                             data.key,
                                             PlayerDataCodeGeneratorConstants.PLAYER_DATA_GETTER_REFERENCE_NAME,
                                             useReactiveProperty ? PlayerDataCodeGeneratorConstants.GETTER_GET_REACTIVE_PROPERTY_METHOD_NAME : PlayerDataCodeGeneratorConstants.GETTER_GET_VALUE_METHOD_NAME,
                                             data.key.ToCamelCase(true)));
            }

            return(new MethodGenerationData
            {
                m_MethodName = PlayerDataCodeGeneratorConstants.KEY_VALUE_GETTER_MAP_METHOD_NAME + category,
                m_MethodReturnType = "void",
                m_MethodBodyStatements = statements,
                m_ProtectionLevel = ProtectionLevel.Private
            });
        }