0
我想克隆/複製另一個對象,它是Outlook.Namespace接口的一個實例。我調查了ICloneable接口。有淺層和深層克隆解決方案克隆/複製一個對象。它們對於已知所有屬性的類很有用。但是,與Outlook.Namespace一樣,我不知道屬性()如何克隆它的屬性。我們可以克隆/複製一個Outlook.NameSpace實例的對象嗎?
你能給我一些建議嗎?非常感謝。 該代碼暴露在Outlook中以獲取聯繫人的電子郵件地址。我想在行克隆OTL對象Outlook.NameSpace otl
private static string GetEmailAddress(Outlook.NameSpace otl, string email, string emailtype, ref int nCount)
{
string sEmailIn = email;
Recipient rcp = null;
try
{
rcp = otl.CreateRecipient(email);
rcp.Resolve();
if (rcp.Resolved)
{
AddressEntry address = rcp.AddressEntry;
ExchangeUser user = address.GetExchangeUser();
email = user.PrimarySmtpAddress;
if (address != null)
{
Marshal.ReleaseComObject(address);
}
if (user != null)
{
Marshal.ReleaseComObject(user);
}
++nCount;
}
}
catch (System.Exception ex)
{
ShoreTrace.TraceLn("Exception while converting email: " + sEmailIn);
ShoreTrace.TraceLn("Content " + ex);
ShoreTrace.TraceLn("Resulting email: " + email);
return sEmailIn;
}
finally
{
if (rcp != null)
{
Marshal.ReleaseComObject(rcp);
}
}
return email;
}
-------- ---------- UPDATE
我調試和觀看OTL對象的值,你可以看到下面的圖片。我不知道我們可以使用foreach循環瀏覽它的所有屬性。然後重新分配給相同類型的對象。看到下面的代碼,並提出您的意見
注意:請打開圖像在新的水龍頭看到更清楚。
public static object Clone(object obj)
{
object new_obj = Activator.CreateInstance(obj.GetType());
foreach (PropertyInfo pi in obj.GetType().GetProperties())
{
if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable)
{
pi.SetValue(new_obj, pi.GetValue(obj, null), null);
}
}
return new_obj;
}
什麼是'rpt',爲什麼要克隆該對象? –
如果庫中的對象不提供克隆它們的方法,那麼你可能不應該這樣做 –
@Carsten:這不是rpt。很抱歉,我的錯誤。爲什麼我想克隆它?因爲後面的代碼保存了outlook的資源:rcp = otl.CreateRecipient outlook(email); rcp.Resolve();當每次調用rcp.Resolve()方法時,Outlook將延遲大約100ms。當Outlook有大量聯繫人時,問題會很嚴重。所以我想克隆一個對象來釋放Outlook資源。 – R700