/// <summary>
 /// 创建 ContestDetailModel 类的新实例。
 /// </summary>
 public ContestDetailModel()
 {
     ContestId             = 0;
     Title                 = string.Empty;
     Creator               = string.Empty;
     UsergroupName         = UsergroupConvert.ConvertToString(UserGroup.Standard);
     CreationTime          = DateTime.Now;
     StartTimeString       = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
     EndTimeString         = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
     ParticipationModeName = ContestParticipationModeConvert.ConvertToString(ContestParticipationMode.Both);
     AuthorizationModeName = ContestAuthorizationModeConvert.ConvertToString(ContestAuthorizationMode.Protected);
     Password              = string.Empty;
 }
        /// <summary>
        /// 将当前数据模型中的内容保存至给定的比赛。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <exception cref="ArgumentNullException"/>
        public void SaveTo(ContestHandle handle)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            using (ContestDataProvider data = ContestDataProvider.Create(handle, false))
            {
                data.Title              = Title;
                data.Creator            = Creator;
                data.AuthorizationGroup = UsergroupConvert.ConvertFromString(UsergroupName);
                data.StartTime          = DateTime.ParseExact(StartTimeString, "yyyy-MM-dd HH:mm:ss", new CultureInfo("en-US"));
                data.EndTime            = DateTime.ParseExact(EndTimeString, "yyyy-MM-dd HH:mm:ss", new CultureInfo("en-US"));
                data.ParticipationMode  = ContestParticipationModeConvert.ConvertFromString(ParticipationModeName);
                data.AuthorizationMode  = ContestAuthorizationModeConvert.ConvertFromString(AuthorizationModeName);
            }

            ContestAuthorization.UpdateContestPassword(handle, Password ?? string.Empty);
        }
        /// <summary>
        /// 从给定的比赛句柄创建 ContestDetailModel 类的新实例。
        /// </summary>
        /// <param name="handle">比赛句柄。</param>
        /// <returns>从给定的比赛句柄创建的比赛详细信息数据模型对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        public static ContestDetailModel FromContestHandle(ContestHandle handle)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }

            ContestDetailModel model = new ContestDetailModel();

            using (ContestDataProvider data = ContestDataProvider.Create(handle, true))
            {
                model.ContestId             = data.ContestId;
                model.Title                 = data.Title;
                model.Creator               = data.Creator;
                model.UsergroupName         = UsergroupConvert.ConvertToString(data.AuthorizationGroup);
                model.CreationTime          = data.CreationTime;
                model.StartTimeString       = data.StartTime.ToString("yyyy-MM-dd HH:mm:ss");
                model.EndTimeString         = data.EndTime.ToString("yyyy-MM-dd HH:mm:ss");
                model.AuthorizationModeName = ContestAuthorizationModeConvert.ConvertToString(data.AuthorizationMode);
                model.ParticipationModeName = ContestParticipationModeConvert.ConvertToString(data.ParticipationMode);
            }

            return(model);
        }