使用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"
答案 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,例外等) - 但更多的是属性集根本不像设置变量的值。相反,它就像调用假设的方法来设置值。