【问题标题】:Could we clone/copy an object which is an instance of Outlook.NameSpace?我们可以克隆/复制一个作为 Outlook.NameSpace 实例的对象吗?
【发布时间】:2014-02-10 21:39:21
【问题描述】:

我想从另一个对象克隆/复制一个对象,该对象是 Outlook.Namespace 接口的一个实例。我调查了ICloneable Interface。克隆/复制对象有浅克隆和深度克隆解决方案。它们对于已知所有属性的类很有用。但是,有了 as Outlook.Namespace,我不知道该属性()如何克隆它。

你能给我一些建议吗?非常感谢。 下面的代码用于获取 Outlook 中联系人的电子邮件地址。我想在Outlook.NameSpace otl 行克隆 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;
    }

-------- 更新 ----------

我调试并观察了 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:那是 otl 而不是 rpt。很抱歉,我的错误。为什么我要克隆它?因为下面的代码保存了outlook的资源:rcp = otl.CreateRecipient outlook(email); rcp.Resolve();每次调用rcp.Resolve()方法时,outlook会延迟100ms左右。当 Outlook 有大量联系人时,问题会很严重。所以我想通过克隆一个对象来释放 Outlook 资源。
  • Outlook.Namespace 只是一个 .NET 对象,用于访问 Outlook 的底层 COM 对象。恐怕您无法复制或克隆该 COM 对象。

标签: c# copy clone


【解决方案1】:

solution 下方是 generic ... 但只有在 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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2014-08-28
    • 2011-06-02
    • 2016-08-31
    • 2010-10-01
    • 2011-04-15
    • 2019-11-18
    • 2015-02-07
    相关资源
    最近更新 更多