public static RecurrenceValue Parse(CalendarReader reader) { RecurrenceFrequency?freq = null; int? interval = null; List <int> byMinute = null; List <int> byHour = null; List <WeekDayNum> byDay = null; List <int> bySetPos = null; List <MonthOfYear> byMonth = null; do { var param = CalendarPropertyParameter.ReadFrom(reader); var name = param.Name.ToUpperInvariant(); switch (name) { case "FREQ": if (freq.HasValue) { throw new Exception("Multiple FREQ rule parts occured"); } freq = ParseFrequency(param.Value); break; case "INTERVAL": if (interval.HasValue) { throw new Exception("Multiple INTERVAL rule parts occured"); } interval = int.Parse(param.Value); break; case "BYMINUTE": if (byMinute != null) { throw new Exception("Multiple BYMINUTE rule parts occured"); } if (param.Values.Count == 0) { throw new Exception("BYMINUTE values expected"); } byMinute = param.Values.Select(int.Parse).ToList(); break; case "BYHOUR": if (byHour != null) { throw new Exception("Multiple BYHOUR rule parts occured"); } if (param.Values.Count == 0) { throw new Exception("BYHOUR values expected"); } byHour = param.Values.Select(int.Parse).ToList(); break; case "BYDAY": if (byDay != null) { throw new Exception("Multiple BYDAY rule parts occured"); } if (param.Values.Count == 0) { throw new Exception("BYDAY values expected"); } byDay = param.Values.Select(WeekDayNum.Parse).ToList(); break; case "BYMONTH": if (byMonth != null) { throw new Exception("Multiple BYMONTH rule parts occured"); } if (param.Values.Count == 0) { throw new Exception("BYMONTH values expected"); } byMonth = param.Values.Select(item => (MonthOfYear)int.Parse(item)).ToList(); break; case "BYSETPOS": if (bySetPos != null) { throw new Exception("Multiple BYSETPOS rule parts occured"); } if (param.Values.Count == 0) { throw new Exception("BYSETPOS values expected"); } bySetPos = param.Values.Select(int.Parse).ToList(); break; default: throw new Exception("Unknown rule part " + name); } } while (reader.PeekOrRead(';')); if (!freq.HasValue) { throw new Exception("FREQ rule part is required"); } return(new RecurrenceValue { Frequency = freq.Value, Interval = interval, ByMinute = byMinute, ByHour = byHour, ByDay = byDay, ByMonth = byMonth, BySetPos = bySetPos }); }