【问题标题】:Duplicating a Non-Serializable (COM) Object复制不可序列化 (COM) 对象
【发布时间】:2013-03-01 14:59:05
【问题描述】:

我正在使用 VB.Net 2010。我想复制由外部(非自我)应用程序输入到我的应用程序中的 (COM) 对象的内容。我不想一一复制字段和属性值(因为可能会在未来的应用程序构建中添加或删除字段/属性)。

对象类型不可序列化。

我尝试了 Reflection 如下(线程copy one object to another上建议的VB代码):

Imports System.Reflection

Public Class ObjectHelper

    ' Creates a copy of an object
    Public Shared Function GetCopy(Of SourceType As {Class, New})(ByVal Source As SourceType) As SourceType

        Dim ReturnValue As New SourceType
        Dim sourceProperties() As PropertyInfo = Source.GetType().GetProperties()

        For Each sourceProp As PropertyInfo In sourceProperties
            sourceProp.SetValue(
                ReturnValue, 
                sourceProp.GetValue(Source, Nothing),
                Nothing)
        Next

        Return ReturnValue

    End Function

End Class

这不起作用,因为返回的 sourceProperties() 数组是空的。

有什么想法吗?

【问题讨论】:

  • 逐个复制值实际上可能不是一个坏主意。这样,您记录了您对每个属性的考虑,并说服自己dest.Prop1 = src.Prop1 确实是复制属性的正确方法(例如,与dest.Prop1 = MakeDeepProp1Copy(src.Prop1) 相反。
  • 您的 COM 对象是否支持任何IPersist 接口 (msdn.microsoft.com/en-us/library/ms688695%28VS.85%29.aspx)?如果可以,您可以使用它。
  • 我不懂 VB.NET 但Source.GetType() 不返回__COMObject?如果你使用 VB.NET 等价于 typeof<SourceType>(根据 Google,它应该是 GetType(SourceType))怎么办?
  • @ZdeslavVojkovic,首先,感谢您的回复。关于您的第一条评论:如何确定该对象的类是否实现了 IPersist 接口? {我没有编写这个类,也没有访问它的代码}
  • 您确定它们是属性还是字段?如果将 Dim 字段添加为 System.Reflection.FieldInfo() = Source.GetType().GetFields 你会得到任何结果吗?

标签: .net vb.net object com clone


【解决方案1】:

首先在实现中有一个bug

Dim sourceProperties() As PropertyInfo = Source.GetType().GetProperties()

应该是

Dim sourceProperties() As PropertyInfo = GetType(SourceType).GetProperties()

Source.GetType() 返回_COMObject 类型,因为这是您的对象的真实类型,而您确实想检查对象实现的接口类型。

其他解决方案是检查对象是否实现IPersist interfaces 中的任何一个并将其用于真正的COM 序列化。您可以通过将对象转换为例如来做到这一点。 System.Runtime.InteropServices.ComTypes.IPersistFile。不幸的是,其他 IPersist* 接口未在该命名空间中定义,因此您必须从某个地方导入它们。

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多