让我举一个例子,而不是给出非常具体的案例(我之前做过)。假设我有一个函数,叫做callingFunction。它有一个参数,称为参数。参数属于未知类型。然后让我们说我希望复制此参数,并将其作为新对象返回。例如,在伪代码中,有些东西......
Function callingFunction(ByVal parameter As Object) As Object
Dim newObj As New Object
'newObj has the same value as parameter, but is a distinctly different object
'with a different reference
newObj = parameter
return newObj
End Function
编辑:附加信息
我第一次发布这个问题时,我只收到了一个回复 - 我觉得也许我的问题太具体了。我想我会解释更多,也许这会有所帮助。我有一个ASP页面,上面有10个表格。我正在尝试使用后面的VB代码提出一个解决方案来向任何表添加新行。当用户单击按钮时,应调用通用的“添加行”功能。
困难在于我无法保证任何表格的内容。新行将具有与其上方的行相同的内容,但是假设有10个表,则1行可以包含任意数量的对象 - 文本框,复选框等。所以我想创建一个通用对象,使其成为与上面的行相同的类型,然后将其添加到新单元格,然后添加到新行,然后添加到表格。
我已经对它进行了彻底的测试,而我的代码唯一失败的部分在于动态生成对象类型。因此我问到复制对象的原因。顺便说一下,到目前为止发布的解决方案都没有正常工作。感谢您的帮助,或许这些额外的信息可以更容易提供建议吗?
答案 0 :(得分:1)
您可以实现以下内容:
Dim p1 As Person = New Person("Tim")
Dim p2 As Object = CloneObject(p1)
Dim sameRef As Boolean = p2 Is p1 'false'
Private Function CloneObject(ByVal o As Object) As Object
Dim retObject As Object
Try
Dim objType As Type = o.GetType
Dim properties() As Reflection.PropertyInfo = objType.GetProperties
retObject = objType.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, Nothing, o, Nothing)
For Each propertyInfo As PropertyInfo In properties
If (propertyInfo.CanWrite) Then
propertyInfo.SetValue(retObject, propertyInfo.GetValue(o, Nothing), Nothing)
End If
Next
Catch ex As Exception
retObject = o
End Try
Return retObject
End Function
Class Person
Private _name As String
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
End Class
答案 1 :(得分:1)
一般情况下你不能这样做。例如,如果parameter
是实现单例模式的类型,那么这不是一个好主意。如果parameter
属于支持复制的类型,则应实现ICloneable
接口。所以,你的功能可能如下所示:
Function MyFunc(ByVal parameter As Object) As Object
Dim cloneableObject As ICloneable = TryCast(parameter, ICloneable)
If Not cloneableObject Is Nothing Then
Return cloneableObject.Clone()
Else
Return Nothing
End If
End Function
答案 2 :(得分:0)
这是一个适用于大多数对象的简单类(假设至少.Net 2.0):
Public Class ObjectCloner
Public Shared Function Clone(Of T)(ByVal obj As T) As T
Using buffer As MemoryStream = New MemoryStream
Dim formatter As New BinaryFormatter
formatter.Serialize(buffer, obj)
buffer.Position = 0
Return DirectCast(formatter.Deserialize(buffer), T)
End Using
End Function
End Class