/// <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> /// <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 }); }
/// <summary> /// 使用指定的题目句柄和描述信息创建 ProblemNotExistException 类的新实例。 /// </summary> /// <param name="handle">题目句柄。</param> /// <param name="message">描述信息。</param> public ProblemNotExistException(ProblemHandle handle, string message) : base(message) { m_handle = handle; }
/// <summary> /// 使用给定的题目句柄创建 ProblemNotExistException 类的新实例。 /// </summary> /// <param name="handle">题目句柄。</param> public ProblemNotExistException(ProblemHandle handle) : base("给定的题目不存在。") { m_handle = handle; }
/// <summary> /// 使用给定的 ProblemHandle 对象和异常消息初始化 ProblemException 类的新实例。 /// </summary> /// <param name="entry">要使用的 ProblemEntry 对象。</param> /// <param name="message">要使用的异常消息。</param> public ProblemException(ProblemHandle entry, string message) : base(message) { Problem = entry ?? throw new ArgumentNullException(nameof(entry)); }
/// <summary> /// 使用 ProblemHandle 对象初始化 ProblemException 类的新实例。 /// </summary> /// <param name="entry">要使用的 ProblemEntry 对象。</param> /// <exception cref="NullReferenceException"/> public ProblemException(ProblemHandle entry) : base($"编号为 {entry.ProblemId} 的题目出现错误。") { Problem = entry; }