复制非可序列化(COM)对象

时间:2013-03-13 15:19:39

标签: .net vb.net object com clone

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

对象类型不可序列化。

我已尝试反射,如下所示(线程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()数组为空。

任何想法?

1 个答案:

答案 0 :(得分:0)

首先,实现中存在错误

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 *接口没有在该命名空间中定义,因此您必须从某个地方导入它们。