3

这有效:

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初始化。

这对我来说毫无意义。怎么会这样?

4

2 回答 2

4

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

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源自FeedQuery。设置UrionFeedQuery调用ParseUri依次设置所有内部属性。

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

var foo = new Foo {
    Width = 100,
    Size = new Size(200, 50),
    Height = 20
};

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

于 2012-05-31T05:17:45.140 回答
2

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

在 Google Calendar API V2 中,我在这里使用的 .NET 库有我认为是EventQuery类中的错误。

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

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

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

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

于 2012-05-31T05:20:52.850 回答