繁体   English   中英

我如何(正确)从EWS继承类,例如约会?

[英]How do I (properly) inherit classes from EWS such as an Appointment?

同样的问题: https//stackoverflow.com/questions/11294207/exchange-web-services-argumentexception-using-my-own-contact-class

我试图从Microsoft.Exchange.WebServices.Data.Appointment编写派生类。 但是,如果不抛出看似序列化错误的内容,则无法保存派生类。 即使我没有对派生类进行任何修改,也会发生这种情况。

这有效:

public void CreateTestAppointment() {
        Appointment appointment = new Appointment(Exchange) {
            ItemClass = "IPM.Appointment", //Exchange Specific. Dont touch unless you     know what this does. I sure as hell don't.
            Subject = string.Format("{0} Test", "Oliver")
        };
        appointment.RequiredAttendees.Add("okane@cottinghambutler.com");
        appointment.Body = new MessageBody {
            Text = "Meeting invite body text placeholder"
        };

        //Add item to the appropriate categories
        appointment.Categories.Add(string.Format("[C]{0}", "Arbitrary Client Group"));

        // Add calendar properties to the appointment.
        appointment.Start = DateTime.Now.AddMinutes(10);
        appointment.End = DateTime.Now.AddMinutes(30);

        appointment.Save(Hc360CallCalendarFolderId, SendInvitationsMode.SendOnlyToAll);
    }

但这不是:

 public void CreateTestAppointment() {
        InheritedAppointment appointment = new InheritedAppointment(Exchange) {
            ItemClass = "IPM.Appointment", //Exchange Specific. Dont touch unless you know what this does. I sure as hell don't.
            Subject = string.Format("{0} Test", "Oliver")
        };
        appointment.RequiredAttendees.Add("okane@cottinghambutler.com");
        appointment.Body = new MessageBody {
            Text = "Meeting invite body text placeholder"
        };

        //Add item to the appropriate categories
        appointment.Categories.Add(string.Format("[C]{0}", "Arbitrary Client Group"));

        // Add calendar properties to the appointment.
        appointment.Start = DateTime.Now.AddMinutes(10);
        appointment.End = DateTime.Now.AddMinutes(30);

        appointment.Save(Hc360CallCalendarFolderId, SendInvitationsMode.SendOnlyToAll);
    }

这很奇怪,因为我实际上并没有在派生类中做任何事情。

    public class InheritedAppointment : Microsoft.Exchange.WebServices.Data.Appointment {
    public InheritedAppointment(ExchangeService serivce)
        : base(serivce) {

    }}

它看起来像是被封装到XML,有些值是null,但我不能为我的生活弄清楚它是什么。 这是原始错误

测试名称:TestMeetingCreation测试FullName:Hc360LibTests.UnitTest1.TestMeetingCreation测试源:c:\\ Users \\ okane \\ Documents \\ Visual Studio 2012 \\ Projects \\ HealthCheck360OutlookCallScheduleHelper \\ Hc360LibTests \\ UnitTest1.cs:第15行测试结果:失败测试持续时间:0:00 :00.5728502

结果消息:测试方法Hc360LibTests.UnitTest1.TestMeetingCreation引发异常:System.ArgumentException:空字符串''不是有效的本地名称。 结果StackTrace:位于Microsoft.Exchange.WebServices.Data.PropertyBag上的Microsoft.Exchange.WebServices.Data.EwsServiceXmlWriter.WriteStartElement(XmlNamespace xmlNamespace,String localName)中的System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix,String localName,String ns)位于Microsoft.Exchange.WebServices.Data上的Microsoft.Exchange.WebServices.Data.CreateRequest 2.WriteElementsToXml(EwsServiceXmlWriter writer) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.WriteBodyToXml(EwsServiceXmlWriter writer) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.WriteToXml(EwsServiceXmlWriter writer) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.EmitRequest(IEwsHttpWebRequest request) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest() at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request) at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest 1.Execute()at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalCreateItems(IEnumerable 1 items, FolderId parentFolderId, Nullable 1 messageDisposition,Nullable 1 sendInvitationsMode, ServiceErrorHandling errorHandling)
at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable
1 sendInvitationsMode, ServiceErrorHandling errorHandling)
at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable
1 sendInvitationsMode, ServiceErrorHandling errorHandling)
at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable
1 messageDisposition,Nullable`1 sendInvitationsMode)at Microsoft.Exchange.WebServices.Data.Appointment.Save(FolderId destinationFolderId,SendInvitationsMode sendInvitationsMode) ()位于c:\\ Users \\ okane \\ Documents \\ Visual Studio 2012 \\ Projects \\ HealthCheck360OutlookCallScheduleHelper \\ HealthCheck360ExchangeLib \\ CallSlotRepository.cs:第70行,位于c:\\ Users \\ okane \\ Documents \\ Visual Studio 2012中的Hc360LibTests.UnitTest1.TestMeetingCreation() Projects \\ HealthCheck360OutlookCallScheduleHelper \\ Hc360LibTests \\ UnitTest1.cs:第17行

似乎无法保存继承的项目。

如果您在EWS托管API的代码中看得太深,您会发现序列化从ServiceObjectDefinitionAttribute或方法ServiceObject.GetXmlElementNameOverride确定XML中的元素名称。 Appointment类继承自Item,而Item又继承自ServiceObject。 Appointment类还具有ServiceObjectDefinitionAttribute,并使用XML元素名称“CalendarItem”进行序列化。

因此,要使用从Appointment继承的类,您需要在类上使用ServiceObjectDefintionAttribute,或者必须覆盖GetXmlElementNameOverride。 不幸的是ServiceObjectDefintionAttribute和GetXmlElementNameOverride是内部的,所以没有办法做到这一点。

问题是为什么要使用继承的类? 您是否希望Exchange能够保存您班级的属性? 在这种情况下,您可能需要查看ExtendedProperties

更新:

如果要将扩展属性公开为您自己类的真实属性,可以通过委派给约会对象来完成。 它并不完美,但它是一个选择:

public class ExtendedAppointment
{
    Appointment _appointment;

    public ExtendedAppointment(Appointment appointment)
    {
        _appointment = appointment;
    }

    public Appointment Appointment { get { return _appointment; } }

    public object SomeExtendedProperty
    {
        get 
        { 
            return _appointment.ExtendedProperties[0].Value;
        }

        set
        {
            _appointment.ExtendedProperties[0].Value = value;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM