使用Redemption RDORecurrencePattern按索引获取约会实例异常咨询
Redemption RDORecurrencePattern.GetOccurence 索引调用异常问题排查与解决
问题复现
创建3天的每日重复会议(2023-11-27至29,每晚20:00-20:25),手动修改每个实例的正文用于区分。使用索引循环调用GetOccurence(i)时:
- 循环逻辑:
for (int i = 0; i < pattern.Occurrences; i++)(pattern.Occurrences返回3) - 返回结果:i=0 → 11/27实例;i=1 → 重复返回11/27实例;i=2 → 11/28实例;始终无法获取11/29实例
- 对比:通过日期调用
GetOccurence(DateTime)可正常获取三个实例
问题原因
- 索引计数逻辑歧义:Redemption中
RDORecurrencePattern.GetOccurence的索引参数设计为1-based,但当重复实例被修改为例外项后,索引与Occurrences属性的统计逻辑出现偏移,导致0-based循环无法覆盖所有实例。 - 例外实例的特殊处理:当所有重复实例都被手动修改后,Redemption对主实例的重复模式索引映射发生异常,索引调用无法正确定位到最后一个实例。
解决方案
方案1:使用GetOccurrences()批量获取实例
优先使用RDORecurrencePattern.GetOccurrences()方法直接获取所有实例的集合,该方法会自动处理例外实例,无需手动管理索引:
private void Button_Click(object sender, RoutedEventArgs e) { RDOSession session = new RDOSession(); session.Logon(System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, true, System.Reflection.Missing.Value, false); RDOFolder calendar = session.GetDefaultFolder(rdoDefaultFolders.olFolderCalendar); foreach (RDOAppointmentItem item in calendar.Items) { if (item.Subject != null && item.Subject.Contains("Redemption Test") && item.IsRecurring) // 仅处理主实例 { Redemption.RDORecurrencePattern pattern = item.GetRecurrencePattern(); foreach (var occurrenceObj in pattern.GetOccurrences()) { RDOAppointmentItem apt = (RDOAppointmentItem)occurrenceObj; Debug.WriteLine(apt.Body); Debug.WriteLine(apt.Start); } } } }
注意:添加
item.IsRecurring判断,避免处理修改后的例外实例(例外实例无有效重复模式)。
方案2:调整索引为1-based循环
若坚持使用索引调用,将索引改为1-based,循环范围调整为1 <= i <= pattern.Occurrences:
for (int i = 1; i <= pattern.Occurrences; i++) { RDOAppointmentItem apt = (RDOAppointmentItem)pattern.GetOccurence(i); Debug.WriteLine(apt.Body); Debug.WriteLine(apt.Start); }
注:此方案在部分例外实例场景下仍可能存在兼容性问题,优先推荐方案1。
方案3:检查并升级Redemption版本
当前使用的6.4.0.6234版本可能存在索引调用的bug,可尝试升级至最新稳定版,确认是否已修复该问题。
内容的提问来源于stack exchange,提问作者K_M
相关产品推荐
相关产品推荐

