设置 EventQuery.Uri 将重置 EventQuery 状态

本文关键字:EventQuery 状态 Uri 设置 | 更新日期: 2023-09-27 18:35:45

这有效:

public override bool GetAppointments(CalendarModel calendar, DateTime startDate, DateTime endDate) {
    foreach (var googcal in _settings.Calendars.Where(googcal => googcal.Selected)) {
        var eventQuery = new EventQuery {
            Uri = new Uri(googcal.ProviderData),
            // Passed in startDate/endDate are inclusive
            StartTime = startDate.Date,
            EndTime = endDate.Date.AddDays(1).AddMilliseconds(-1)
        };
        var eventFeed = Service.Query(eventQuery);
        foreach (EventEntry appt in eventFeed.Entries) {
...
        }
    }
    return true;
}

这不会:

public override bool GetAppointments(CalendarModel calendar, DateTime startDate, DateTime endDate) {
    foreach (var googcal in _settings.Calendars.Where(googcal => googcal.Selected)) {
        var eventQuery = new EventQuery {
            // Passed in startDate/endDate are inclusive
            StartTime = startDate.Date,
            EndTime = endDate.Date.AddDays(1).AddMilliseconds(-1),
            Uri = new Uri(googcal.ProviderData)
        };
        var eventFeed = Service.Query(eventQuery);
        foreach (EventEntry appt in eventFeed.Entries) {
...
        }
    }
    return true;
}

在第一种情况下,Event.Query.StartTimeEndTime设置正确,如预期的那样。

在第二种情况下,它们是未初始化的(1/1/0001 12:00:00 AM)。

唯一的区别是对象初始值设定项中属性的顺序。

对于笑容,我这样做了:

// Passed in startDate/endDate are inclusive
StartTime = startDate.Date,
Uri = new Uri(googcal.ProviderData),
EndTime = endDate.Date.AddDays(1).AddMilliseconds(-1)

果然EndTime是正确的,但StartTime是外行的。

这对我来说毫无意义。怎么可能?

设置 EventQuery.Uri 将重置 EventQuery 状态

对象初始值设定项只是设置属性。在另一个属性之前设置一个属性的任何副作用都将可见,就像您将其写出来一样:

var tmp = new EventQuery();
tmp.StartTime = startDate.Date;
tmp.EndTime = endDate.Date.AddDays(1).AddMilliseconds(-1);
tmp.Uri = new Uri(googcal.ProviderData);
var eventQuery = tmp;

在这种情况下,我怀疑通过设置 StartTime/EndTime 添加了某些内部状态,但通过设置 Uri 重置。

编辑:好的,我现在已经找到了相关的代码。

EventQuery源于FeedQueryParseUri FeedQuery调用上设置Uri,进而设置所有内部属性。

基本上,当你有相互关联的属性时,这种事情总是会发生。假设你有一个类型的Size属性,它反映了宽度和高度,也可以独立设置——你可以写:

var foo = new Foo {
    Width = 100,
    Size = new Size(200, 50),
    Height = 20
};
最终尺寸为

200x20。基本上,当您了解Uri是表示完整查询 URI 而不仅仅是词干的属性时,这一切都是有意义的。

令人惊讶的是,在Stack Overflow上提问的行为如何帮助您了解正在发生的事情。 我把这个问题留在这里,以便其他遇到这个问题的人都知道发生了什么......我不能是唯一一个会遇到这个问题的人。

在 Google 日历 API V2 中,我在这里使用的 .NET 库在 EventQuery 类中存在我认为的错误。

具体来说,设置 Uri 会对对象产生副作用。具体而言,它会导致初始化StartTimeEndTime属性。

我已经通过这样做修复了我的代码:

var eventQuery = new EventQuery(googcal.ProviderData) {
    StartTime = startDate.Date, 
    EndTime = endDate.Date.AddDays(1).AddMilliseconds(-1)
};

IOW,在构造函数中设置 Uri。