设置EventQuery.Uri重置EventQuery状态

时间:2012-05-31 05:14:03

标签: c# google-calendar-api

这有效:

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未正式发布。

这对我没有意义。怎么会这样?

2 个答案:

答案 0 :(得分: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;

在这种情况下,我怀疑通过设置{{1}来设置StartTime / EndTime重置,将某些内部状态添加到 }}

编辑:好的,我现在找到了the relevant code

Uri来自EventQuery。在FeedQuery调用Uri上设置FeedQuery,然后调用所有内部属性。

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

Size

最终尺寸为200x20。基本上,当您理解var foo = new Foo { Width = 100, Size = new Size(200, 50), Height = 20 }; 是表示完整查询URI的属性而不仅仅是词干时,这一切都是有意义的。

答案 1 :(得分: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。