gpt4 book ai didi

c# - 在事件插入中强制使用新 ID

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:46 27 4
gpt4 key购买 nike

我正在使用 Google Calendar API 并将事件从一个日历复制到另一个日历,如下所示:

CalendarService service = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = this.ApplicationName
});
CalendarListResource.ListRequest calRequest = service.CalendarList.List();
calRequest.MinAccessRole = CalendarListResource.ListRequest.MinAccessRoleEnum.Owner;
CalendarList calendars = calRequest.Execute();
CalendarListEntry selectedCalendar = calendar.Items[0];

EventsResource.ListRequest eventRequest = service.Events.List(selectedCalendar.Id);
eventRequest.TimeMin = DateTime.Now;
eventRequest.ShowDeleted = false;
eventRequest.SingleEvents = true;
eventRequest.MaxResults = 50;
eventRequest.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;
Events events = eventRequest.Execute();

Event currentEvent = events.Items[0];
EventsResource.InsertRequest copyRequest = service.Events.Insert(currentEvent, calendarToCopyTo.Id);
copyRequest.Execute();

效果很好....第一次。第二次,它抛出错误,因为事件 ID 在 calendarToCopyTo 上不再是唯一的(即使我删除了刚刚创建的事件并重试)。我的问题是:如何在我“插入”的事件中强制生成新的 Id?我在这些行之前尝试过 currentEvent.Id = "";,但这似乎没有用。

Google.Apis.Requests.RequestError The requested identifier already exists. [409] Errors [ Message[The requested identifier already exists.] Location [ - ] Reason[duplicate] Domain[global] ]

根据这个example (.NET 之一),我应该只创建一个新的 Event 对象(基于 currentEvent),然后将其作为参数发送到 Insert 请求。所以这里的另一个问题是:将所有属性从一个 Event 变量(此处为 currentEvent)复制到另一个变量的最简单方法是什么?

最佳答案

好的,这是我学到的(以及我想出的解决方案):

首先,如果你想使用我上面的代码,你必须在初始化 copyRequest 之前调用这两行:

currentEvent.Id = "";
currentEvent.ICalUID = "";

(因为IdICalUID都作为Id使用,所以都需要重新设置)。 此处重要说明:如果您稍后要调用带有 currentEvent 的 UpdateRequest 之类的东西,将会出现问题,因为您清除了该对象的 ID(因为 UpdateRequest 需要 eventId 作为参数 - 所以即使如果您以前保存过它,则必须在初始化该请求之前再次“重新设置”Id 和 ICalUID)。 [ICalUID 本质上等于 Id + "@google.com"]

我的解决方案:

我没有保存 Id 和 ICalUID,清除它,复制事件,然后将它们设置回我的 UpdateRequest 之前,而是创建了一个用于克隆事件的克隆方法:

private Event clone(Event eventToClone)
{
Event result = new Event();

foreach (PropertyInfo property in typeof(Event).GetProperties())
{
if (property.CanRead)
property.SetValue(result, property.GetValue(eventToClone, null));
}

return result;
}

所以现在我将事件复制到另一个日历的代码变成了这样:

Event newEvent = clone(currentEvent);
newEvent.Id = "";
newEvent.ICalUID = "";
EventsResource.InsertRequest copyRequest = service.Events.Insert(newEvent, calendarToCopyTo.Id);
copyRequest.Execute();

希望这对以后的人有帮助!

关于c# - 在事件插入中强制使用新 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42128303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com