我正在使用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()数组为空。
任何想法?
答案 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 *接口没有在该命名空间中定义,因此您必须从某个地方导入它们。