设为首页 收藏本站
查看: 1015|回复: 0

[经验分享] 对Outlook中的不同的实体类实现一个通用的Adapter类

[复制链接]

尚未签到

发表于 2015-9-13 13:40:20 | 显示全部楼层 |阅读模式
  在Outlook中存在不同的域对象MailItem ,ContactItem,TaskItem,AppointmentItem,NoteItem...这些类都是继承ItemEvents_10_Event接口的。而且这些类里面都有EntryID,UserProperties,ItemProperties,Parent,Class,这些属性,都实现了Save(),Delete(),Display()方法。
如果想实现这个Adapter类的话,
第一,我可以获得这些公用的方法。
第二,我可以调用这些类公用的方法。
第三,我可以对这些类的事件做些扩展,比如在这些领域对象的事件上加一些取消的功能。
第一和第二两个从不明确的对象实例上面获得属性和运行方法,完全满足反射的要求。第三条只要把判断该对象是否满足ItemEvents_10_Event接口就可以了。所以该类的实现如下
public sealed class ItemAdapter
{
  MSOutlook.ItemEvents_10_Event _outlookItem;
  Type _outlookItemType;
  public event CancelEventHandler Opening;
  public event CancelEventHandler Writing;
  public event CancelEventHandler Closing;
  public event CancelEventHandler Deleting;
  public static ItemAdapter FromObject(object obj)
  {
   if (obj is MSOutlook.ItemEvents_10_Event)               
    return new ItemAdapter((MSOutlook.ItemEvents_10_Event)obj);
   return null;
  }
  public ItemAdapter(MSOutlook.ItemEvents_10_Event item)
  {
   _outlookItem = item;
   _outlookItemType = _outlookItem.GetType();
  _outlookItem.Open += new MSOutlook.ItemEvents_10_OpenEventHandler(OnOpen);
            _outlookItem.Close += new MSOutlook.ItemEvents_10_CloseEventHandler(OnClose);
   _outlookItem.Write += new MSOutlook.ItemEvents_10_WriteEventHandler(OnWrite);
            _outlookItem.BeforeDelete += new MSOutlook.ItemEvents_10_BeforeDeleteEventHandler(OnDelete);
  }
  void OnClose(ref bool cancel)
  {
   CancelEventArgs args = new CancelEventArgs(cancel);
   Closing(this, args);
   cancel = args.Cancel;
  }
  void OnDelete(object Item, ref bool cancel)
  {
   CancelEventArgs args = new CancelEventArgs(cancel);
   Deleting(this, args);
   cancel = args.Cancel;
  }
  void OnWrite(ref bool cancel)
  {
   CancelEventArgs args = new CancelEventArgs(cancel);
   Writing(this, args);
   cancel = args.Cancel;
  }
  void OnOpen(ref bool cancel)
  {
   CancelEventArgs args = new CancelEventArgs(cancel);
   Opening(this, args);
   cancel = args.Cancel;
  }
  public MSOutlook.UserProperties UserProperties
  {
   get { return (MSOutlook.UserProperties)GetProperty("UserProperties"); }
  }
  public MSOutlook.ItemProperties ItemProperties
  {
   get { return (MSOutlook.ItemProperties)GetProperty("ItemProperties"); }
  }
  public string EntryID
  {
   get { return (string)GetProperty("EntryID"); }
  }
  public object Parent
  {
   get { return GetProperty("Parent"); }
  }
  public MSOutlook.OlObjectClass Class
  {
   get { return (MSOutlook.OlObjectClass)GetProperty("Class"); }
  }
  public void Save()
  {
   InvokeMethod("Save");
  }
  public void Delete()
  {
   InvokeMethod("Delete");
  }
  public void Display()
  {
   InvokeMethod("Display");
  }
  internal object GetProperty(string name)
  {
   return _outlookItemType.InvokeMember(
    name,
    BindingFlags.GetProperty,
    null, _outlookItem, null);
  }
  internal void SetProperty(string name, object value)
  {
   _outlookItemType.InvokeMember(
    name,
    BindingFlags.SetProperty,
    null, _outlookItem, new object[] { value });
  }
  internal object InvokeMethod(string name, params object[] parameters)
  {
   return _outlookItemType.InvokeMember(
    name,
    BindingFlags.InvokeMethod,
    null, _outlookItem, parameters);
  }
  public MSOutlook.AppointmentItem GetAsAppointment()
  {
   if (this.Class != MSOutlook.OlObjectClass.olAppointment)
    throw new ApplicationException(string.Format("Can't GetAsAppointment for {0}", this.Class));
  return (MSOutlook.AppointmentItem)_outlookItem;
  }
  public MSOutlook.TaskItem GetAsTask()
  {
   if (this.Class != MSOutlook.OlObjectClass.olTask)
    throw new ApplicationException(string.Format("Can't GetAsTask for {0}", this.Class));
  return (MSOutlook.TaskItem)_outlookItem;
  }
  public MSOutlook.PostItem GetAsPost()
  {
   if (this.Class != MSOutlook.OlObjectClass.olPost)
    throw new ApplicationException(string.Format("Can't GetAsPost for {0}", this.Class));
  return (MSOutlook.PostItem)_outlookItem;
  }
  public MSOutlook.MailItem GetAsMail()
  {
   if (this.Class != MSOutlook.OlObjectClass.olMail)
    throw new ApplicationException(string.Format("Can't GetAsMail for {0}", this.Class));
  return (MSOutlook.MailItem)_outlookItem;
  }
}
其实第一第二并不满足Adapter模式的定义,第一第二只是一个具体的抽象,是对不同对象共同特征的一个封装,而第三条才满足Adapter模式的定义,所以该类实现的是两个功能。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-113104-1-1.html 上篇帖子: Silverlight 获取Outlook下所有联系人帐号信息 下篇帖子: How to Unblock Unsafe Attachments in Outlook
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表