/// <summary>
        /// 从给定的题目句柄对象创建 NativeProblemDataProvider 对象。
        /// </summary>
        /// <param name="handle">题目句柄对象。</param>
        /// <param name="isReadonly">一个值,该值指示创建的 NativeProblemDataProvider 对象是否处于只读模式。</param>
        /// <returns>从给定题目句柄创建的 NativeProblemDataProvider 对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="InvalidProblemException"/>
        /// <exception cref="ProblemNotExistException"/>
        public static NativeProblemDataProvider Create(ProblemHandle handle, bool isReadonly)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }
            if (!handle.IsNativeProblem)
            {
                throw new InvalidProblemException(handle, "给定的题目句柄不是 BITOJ 本地题目。");
            }

            // 尝试从题目句柄中解析出题目ID。
            if (!int.TryParse(handle.ProblemId.Substring(3), out int id))
            {
                throw new InvalidProblemException(handle, "给定的题目句柄非法。");
            }

            // 从底层数据库中查询题目实体对象。
            ProblemEntity entity = ProblemArchieveManager.Default.DataContext.GetProblemEntityById(id);

            if (entity == null)
            {
                throw new ProblemNotExistException(handle);
            }

            // 创建底层题目数据访问器对象。
            ProblemAccessHandle entryHandle = new ProblemAccessHandle(entity.ProblemDirectory);

            return(new NativeProblemDataProvider()
            {
                m_entity = entity,
                m_accessHandle = entryHandle,
                m_readonly = isReadonly
            });
        }
 /// <summary>
 /// 初始化 NativeProblemDataProvider 类的新实例。
 /// </summary>
 private NativeProblemDataProvider()
 {
     m_entity       = null;
     m_accessHandle = null;
     m_readonly     = true;
     m_disposed     = false;
 }
        /// <summary>
        /// 从给定的题目句柄对象创建 NativeProblemDataProvider 对象。
        /// </summary>
        /// <param name="handle">题目句柄对象。</param>
        /// <param name="isReadonly">一个值,该值指示创建的 NativeProblemDataProvider 对象是否处于只读模式。</param>
        /// <returns>从给定题目句柄创建的 NativeProblemDataProvider 对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="InvalidProblemException"/>
        /// <exception cref="ProblemNotExistException"/>
        public static ProblemDataProvider Create(ProblemHandle handle, bool isReadonly)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }
            if (!handle.IsNativeProblem)
            {
                throw new InvalidProblemException(handle, "给定的题目句柄不是 BITOJ 本地题目。");
            }

            // 从底层数据库中查询题目实体对象。
            ProblemDataContext context = new ProblemDataContextFactory().CreateContext();
            ProblemEntity      entity  = context.GetProblemEntityById(handle.ProblemId);

            if (entity == null)
            {
                context.Dispose();
                throw new ProblemNotExistException(handle);
            }

            // 创建底层题目数据访问器对象。
            ProblemAccessHandle entryHandle = new ProblemAccessHandle(entity);

            return(new ProblemDataProvider()
            {
                m_context = context,
                m_entity = entity,
                m_accessHandle = entryHandle,
                m_readonly = isReadonly
            });
        }