【发布时间】: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 对象。