2010-12-08 34 views
1

使用msvs 2008/.net 3.5/Outlook 2007我遇到了以下問題:
嘗試創建並添加新的收件人到現有的MailItem實例:class Microsoft.Office.Interop.Outlook.Recipient:屬性的設置程序AddressEntry.Name和AddressEntry.Address沒有任何作用

using Microsoft.Office.Interop.Outlook; 
Recipient rcp = mail.Recipients.Add("[email protected]"); 
if (rcp.Resolve()) 
{ 
    rcp.AddressEntry.Name = "Foo"; 
} 

沒有編譯錯誤或警告發生,不會拋出異常,而是財產「名稱」轉讓後,其值保持不變('富@酒吧。 com公司)。它不應該是「富」嗎? (此屬性被廣泛記錄爲'讀/寫')

有沒有人有任何跡象表明此原因?
更一般地說(我是.net的新手):它是一種常見的C#'特性',制定者可能會默默地失敗?
感謝您的任何建議!

替代的解決方案:
這句法:

Recipient rcp = mail.Recipients.Add("Foo [email protected]") 

instanciates一個Recipient對象,其中:

rcp.AddressEntry.Name == "Foo" 
rcp.AddressEntry.Address == "[email protected]" 

回答

1

爲Outlook問題 雖然你是正確的,因爲Name財產上AddressEntry是可讀/寫的,它確實指定它在解析後不應該被修改,並且可以設置in order to lookup。如果在接球隊中有一些後衛,我不會感到驚訝。您也可以使用reference this thread,它描述了相同的問題,並且回覆了一些更多信息,說明更改Recipient.Name或創建新的AddressEntry並分配它。

對於你的C#屬性問題 在.NET(和COM以及 - 展望互操作是通過COM進行),屬性是真的不同語法的方法。

通常在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)沒有設置,除非ValidateName方法返回true。所以如果你設置了name屬性並且它是無效的,那麼詢問name屬性的值就不會顯示你的更新。

所以我不會說他們默默地「失敗」 - 通常的做法是以一些文檔化的方式暴露問題(IDataErrorInfo,異常等) - 但更多的是屬性集根本不像設置一個變量的值。相反,這就像調用假設的方法來設置一個值。

+0

你說得對,屬性名這個行爲記錄在這裏:http:// msdn。microsoft.com/en-us/library/ms528289%28v=EXCHG.10%29.aspx(section'remarks')。 現在事情更清楚了。感謝菲利普! – Francois 2010-12-09 11:18:30

相關問題