class Microsoft.Office.Interop.Outlook.Recipient:属性的setter AddressEntry.Name和AddressEntry.Address无效

时间:2010-12-08 14:35:46

标签: c# .net outlook

使用msvs 2008 / .net 3.5 / Outlook 2007我遇到了以下问题:
尝试创建新的收件人并将其添加到现有的MailItem实例时:

using Microsoft.Office.Interop.Outlook;
Recipient rcp = mail.Recipients.Add("foo@bar.com");
if (rcp.Resolve())
{
    rcp.AddressEntry.Name = "Foo";
}

没有发生编译错误或警告,没有抛出异常,但在分配属性“Name”后,其值保持不变('foo@bar.com')。不应该是“foo”吗? (此属性被广泛记录为“读/写”)

有没有人说明原因?
更一般地说(我是.net的新手):这是一个常见的C#'特征',它可能会默默地失败吗? 谢谢你的建议!

替代解决方案:
语法如下:

Recipient rcp = mail.Recipients.Add("Foo foo@bar.com")

实例化Recipient对象,其中:

rcp.AddressEntry.Name == "Foo"
rcp.AddressEntry.Address == "foo@bar.com"

1 个答案:

答案 0 :(得分:1)

对于您的展望问题 虽然您确认AddressEntry上的Name属性是可读/写的,但它确实指定在解析后不应修改它,并且可以设置为in order to lookup。如果在制定者中有一些守卫,我不会感到惊讶。您还可以reference this thread描述相同的问题并获得一些回复,其中包含更多信息,说明要更改Recipient.Name,或创建新的AddressEntry并进行分配。

针对您的C#属性问题 在.net(以及COM - 以及通过COM完成outlook interop)中,属性实际上是一种具有不同语法的方法。

通常在c#中,你会define a property喜欢这样:

private string _name;
public string Name 
{
   get{ return _name;}
   set{ _name = value;}
}

如果AddressEntry.Name被定义为这样,那么是的,您可能希望在设置后立即获得“Foo”。

但没有什么能阻止它被宣布:

private string _name;
public string Name 
{
   get{ return _name;}
   set
   { 
      if( ValidateName(value))
      {
         _name = value;
      }
   }
}

请注意,在这种情况下,除非_name方法返回true,否则不会设置支持字段ValidateName)。因此,如果您设置name属性并且它无效,则询问name属性的值将不会显示您的更新。

所以我不会说他们默默地“失败” - 通常的做法是以某种记录的方式公开问题(IDataErrorInfo,例外等) - 但更多的是属性集根本不像设置变量的值。相反,它就像调用假设的方法来设置值。