c#:要成为可XML序列化的,从IEnumerable继承的类型必须有Add(System.Object)的实现

本文关键字:类型 Add 实现 Object System 继承 IEnumerable XML 序列化 | 更新日期: 2023-09-27 18:16:15

我有以下代码:

private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv)
{
    FindItemsResults<Appointment> appointments = serv.FindAppointments(WellKnownFolderName.Calendar, calendar);
    var serializer = new XmlSerializer(appointments.GetType());
    var writer = new StringWriter();
    try
    {
        serializer.Serialize(writer, appointments);
        Console.WriteLine(writer.GetStringBuilder().ToString());
        Console.ReadLine();
    }
    catch (Exception ex) 
    {
        Console.WriteLine(ex);
        Console.ReadLine();
    }
    return writer.GetStringBuilder().ToString();
}

初始化序列化器时,得到异常:

要使XML可序列化,从IEnumerable继承的类型必须具有

Add(System.Object)在其继承层次的所有级别的实现。

Microsoft.Exchange.WebServices.Data。FindItemsResults不实现Add(System.Object).

我搜索了一下,我得出的结论是,我必须添加一个公共的add (Object obj)方法。现在我不太确定这个方法应该包含什么,或者当它被调用时,有人能给我指出正确的方向吗?Add方法是否需要手动添加每个约会?

一些我觉得有用的链接:在这里

感谢。

c#:要成为可XML序列化的,从IEnumerable继承的类型必须有Add(System.Object)的实现

Add()方法应该具有IEnumerable对象中元素类型的单个参数。例如,如果FindItemsResults实现了IEnumerable<T>,那么你可以添加void Add(T value)方法。如果您希望FindItemsResults是只读的,您可以通过ToList()扩展方法将FindItemsResults转换为List,并序列化列表而不是FindItemsResults对象本身。

你需要实现一个Add方法,当你反序列化你的FindItemsResult和它所产生的对象时,它可以把IEnumerable包含的类型的对象放回IEnumerable中。IEnumerable不像List,所以反序列化的项一般不能直接放回某种容器中。没有办法知道如何实现实现IEnumerable的类,因此必须显式地为它编写一个Add方法。

我在创建分页结果对象时遇到了同样的问题。选择的答案基本上是正确的,但我想我应该只是格式好一点,并添加我自己的提示。

基本上我实现了Add,但我让它抛出一个异常来指导任何未来可能试图调用它的开发人员,因为作为一个结果集,我想保持它是只读的。序列化器仍然可以正常工作,因此在序列化时显然不会调用Add。我可能会遇到反序列化的问题,但由于这个对象纯粹是为了检索结果集,所以一切都应该是好的。

下面是我在实现IEnumerable的类中添加的内容:

    public void Add(T value)
    {
        throw new NotSupportedException("Add is not supported for paged results.  Try adding new items to the repository instead.");
    }