Как я могу скопировать объект неизвестного типа в 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 строка могла содержать любое количество объектов - текстовые поля, флажки, и т.д. Таким образом, я хочу создать родовой объект, сделайте ее из того же типа как строка выше ее, затем добавьте его к новой ячейке, затем к новой строке, затем к таблице.

Я протестировал его полностью, и единственная часть, которую мой код приводит к сбою на лжи в этом динамическом поколении типа объекта. Следовательно, почему я спросил о копировании объектов. Ни одно из решений, отправленных до сих пор, не работает правильно, между прочим. Спасибо за Вашу справку до сих пор, возможно, эта дополнительная информация поможет предоставить консультацию?

1
задан John Saunders 2 August 2010 в 19:57
поделиться

3 ответа

Вы не можете этого сделать вообще. И это не будет хорошей идеей, например, если параметр имеет тип, реализующий одноэлементный шаблон. Если параметр имеет тип, поддерживающий копирование, он должен реализовывать интерфейс 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
1
ответ дан 2 September 2019 в 22:36
поделиться

Вы можете реализовать что-то вроде этого:

      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
ответ дан 2 September 2019 в 22:36
поделиться

Вот простой класс, который будет работать для большинства объектов (предполагается как минимум .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
0
ответ дан 2 September 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: