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