我们面临的问题是,我们需要在Outlook中确定特定的约会,即使这是一个经常性的约会。但由于GlobalAppointmentID对于整个系列而言是唯一的,我们不知道如何。
据我所知,当一个约会是一个重复约会时,没有特定的唯一ID。所以我们认为我们通过将Ticks中的Start-Time添加到GlobalAppointmentID来生成我们自己的ID,但是我们需要/想要在约会对象中保存这个新ID(因为StartTime可能会改变)。
我的问题:是否有办法识别特定的约会,如果没有,我如何在特定的约会中保存价值,这对每个收件人始终是可访问的和最新的?
//编辑:更具体一点:我们有一个outlook插件,允许将文件上传到我们的服务器,必须将其映射到特定约会(以及所有收件人)。对于正常的单次会议,我们只是GlobalAppointmentID。如果是定期约会,则仍需要将其映射到一个特定的"会议"。大多数时候,这次会议/任命不包含任何时间或任何例外情况。所以我需要在C#中获得这个特定的ID。
答案 0 :(得分:2)
请记住,定期约会的实例并不存在(考虑没有结束日期的约会)。如果您有一个例外(作为主约会上的附件存储),它有2个ID - 主约会ID和实例ID,它是从主ID导出并嵌入例外日期。
查看OutlookSpy的约会(点击IMessage按钮)并查看http://msdn.microsoft.com/en-us/library/ee157690(v=exchg.80).aspx的约会ID格式。
答案 1 :(得分:0)
这是旧的,但它仍然显示在搜索中,因此,在我们公司中,我刚刚尝试过这个问题。
正如德米特里(Dmitry)所写,重复约会的出现不存在,除非并且直到用户将其更改后变为例外,这些约会才成为例外。这也意味着他们没有独立的ID。
但是,如果未更改,则每个异常都有其发生的原始日期。对于每个非异常事件,该日期只是该事件的开始日期。
您可以结合使用全局约会ID和原始日期来获得一个ID,该ID即使发生了约会也可以唯一地标识该约会:
device a
在这里,我使用NodaTime中的LocalDate表示没有时间成分的原始日期。
可以轻松访问全局约会ID。如上所述,发生的原始日期也不例外,它只是约会开始的日期部分。
当您仅拥有 public struct AppointmentId : IEquatable<AppointmentId>
{
private readonly string GlobalAppointmentId;
private readonly LocalDate? OriginalDate;
public AppointmentId(string globalAppointmentId)
{
this.GlobalAppointmentId = globalAppointmentId;
this.OriginalDate = null;
}
public AppointmentId(string globalAppointmentId, LocalDate originalDate)
{
this.GlobalAppointmentId = globalAppointmentId;
this.OriginalDate = originalDate;
}
public bool Equals(AppointmentId other)
{
return this.GlobalAppointmentId.Equals(other.GlobalAppointmentId, StringComparison.Ordinal) &&
this.OriginalDate == other.OriginalDate;
}
public override bool Equals(object obj) =>
obj is AppointmentId other && this.Equals(other);
public override int GetHashCode()
{
unchecked
{
int hash = 62207;
hash += 3 * this.GlobalAppointmentId.GetHashCode();
hash += (5 * this.OriginalDate?.GetHashCode() ?? 0);
return hash;
}
}
public override string ToString()
{
if (this.GlobalAppointmentId == null) return "<None>";
if (this.OriginalDate == null)
{
return $"{this.GlobalAppointmentId}";
}
return $"{OriginalDate.Value)} / {GlobalAppointmentId}";
}
public static bool operator ==(AppointmentId x, AppointmentId y) => x.Equals(y);
public static bool operator !=(AppointmentId x, AppointmentId y) => !(x == y);
}
中的AppointmentItem
对象而不是Exception
对象时,异常会更加麻烦,因为原始日期无法直接获得。但是您可以通过RecurrencePattern
来获取它:
PropertyAccessor