如何在VB.net中复制未知类型的对象?

时间:2010-07-29 19:51:53

标签: vb.net

让我举一个例子,而不是给出非常具体的案例(我之前做过)。假设我有一个函数,叫做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行可以包含任意数量的对象 - 文本框,复选框等。所以我想创建一个通用对象,使其成为与上面的行相同的类型,然后将其添加到新单元格,然后添加到新行,然后添加到表格。

我已经对它进行了彻底的测试,而我的代码唯一失败的部分在于动态生成对象类型。因此我问到复制对象的原因。顺便说一下,到目前为止发布的解决方案都没有正常工作。感谢您的帮助,或许这些额外的信息可以更容易提供建议吗?

3 个答案:

答案 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