2014-01-21 40 views
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循環瀏覽它的所有屬性。然後重新分配給相同類型的對象。看到下面的代碼,並提出您的意見 enter image description here

注意:請打開圖像在新的水龍頭看到更清楚。

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; 
    } 
+0

什麼是'rpt',爲什麼要克隆該對象? –

+0

如果庫中的對象不提供克隆它們的方法,那麼你可能不應該這樣做 –

+0

@Carsten:這不是rpt。很抱歉,我的錯誤。爲什麼我想克隆它?因爲後面的代碼保存了outlook的資源:rcp = otl.CreateRecipient outlook(email); rcp.Resolve();當每次調用rcp.Resolve()方法時,Outlook將延遲大約100ms。當Outlook有大量聯繫人時,問題會很嚴重。所以我想克隆一個對象來釋放Outlook資源。 – R700

回答

0

下面solutiongeneric ...但它只是工作,如果classserializable

 /// <summary> 
     /// Only applicable for serializable object 
     /// Makes a copy from the object. 
     /// Doesn't copy the reference memory, only data. 
     /// </summary> 
     /// <typeparam name="T">Type of the return object.</typeparam> 
     /// <param name="item">Object to be copied.</param> 
     /// <returns>Returns the copied object.</returns> 
     public static T Clone<T>(this T item) 
     { 
      if (item != null) 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 
       MemoryStream stream = new MemoryStream(); 

       formatter.Serialize(stream, item); 
       stream.Seek(0, SeekOrigin.Begin); 

       T result = (T)formatter.Deserialize(stream); 

       stream.Close(); 

       return result; 
      } 
      else 
       return default(T); 
     } 
相關問題