/// <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 }); }