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は、期待どおりに正しく設定されています。

2 番目のケースでは、初期化されていません ( 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;

この場合、/を設定すると内部状態が追加されますが、を設定するとリセットされると思われます。StartTimeEndTimeUri

編集:さて、関連するコードが見つかりました。

EventQueryから派生しFeedQueryます。UriオンFeedQueryコールを設定する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 で質問するという行為が、何が起こっているのかを理解するのにどのように役立つかは驚くべきことです。この問題に出くわした他の人が何が起こっているのかを知ることができるように、この質問をここに残しておきます...この問題を抱えているのは私だけではありません.

EventQueryGoogle Calendar API V2 では、ここで使用している .NET ライブラリにクラス のバグと思われるものが含まれています。

具体的には、設定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 に答える