C# 设置EventQuery.Uri将重置EventQuery状态

C# 设置EventQuery.Uri将重置EventQuery状态,c#,google-calendar-api,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 {

这项工作:

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.StartTime
EndTime
按预期正确设置

在第二种情况下,它们未初始化(
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
没有斜体

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

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

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
。在
FeedQuery
上设置
Uri
将调用
ParseUri
,从而设置所有内部属性

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

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

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

令人惊讶的是,询问堆栈溢出问题可以帮助您了解发生了什么。我把这个问题留在这里是为了让任何其他遇到这个问题的人都知道发生了什么…我不是唯一会有这个问题的人

在Google Calendar API V2中,我在这里使用的.NET库在
EventQuery
类中有一个bug

具体来说,设置
Uri
对对象有副作用。具体而言,它导致初始化
StartTime
EndTime
属性

我已通过以下操作修复了代码:

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

在构造函数中设置Uri

也许问题出在别的地方。顺序不会影响我的对象初始化是的,你的怀疑是对的Jon。请参阅我刚才发布的答案。如果您之前说过您正在使用v2,这会有所帮助-我已经查看了v3代码。您可以在构造函数中设置它-或者您可以在设置其他属性之前设置它,如第一个示例所示。不过我可能会把它传递给构造函数。我不认为这是一个bug本身,尽管它可以被更清晰地记录下来。它不是bug,你只是在错误地使用它。您可以设置Uri或其他属性。Uri永远不会被存储。它被分解成组件,每次被请求时都会重新组装。所以,如果您先设置URI,然后在再次查询URI时更改StartTime和EndTime,则情况会有所不同。它将从您刚才提供的两个组件StartTime和EndTime重新组装。