/// <summary>
    /// 해당 오브젝트의 클래스 프로퍼티 정보를 전부 얻어둔다
    /// </summary>
    /// <param name="settingObj"></param>
    private static void CachePropertiesForClass(IInGameSetting settingObj)
    {
        System.Type type = settingObj.GetType();

        if (s_propLookupTable.ContainsKey(type))                                                        // * 이미 캐싱되었다면 패스
        {
            return;
        }

        //
        var propInfoTable = new Dictionary <string, PropertyInfo>();

        s_propLookupTable[type] = propInfoTable;

        // IInGameSetting 의 프로퍼티 이름으로 해당 클래스 타입에서 검색하여 PropertyInfo를 얻어온다

        int nameCount = s_propertyNames.Length;

        for (int i = 0; i < nameCount; i++)
        {
            string name = s_propertyNames[i];
            propInfoTable[name] = type.GetProperty(name);
        }
    }
 /// <summary>
 /// 프로퍼티 정보를 얻어옴
 /// </summary>
 /// <param name="propertyName"></param>
 /// <returns></returns>
 protected static PropertyInfo LookupPropertyInfo(IInGameSetting settingObj, string propertyName)
 {
     //Debug.Log(string.Format("LookupPropertyInfo : {0} {1}", settingObj.GetType(), propertyName));
     CachePropertiesForClass(settingObj);
     return(s_propLookupTable[settingObj.GetType()][propertyName]);
 }