Вместо того, чтобы давать очень конкретный случай (который я сделал ранее), позвольте мне дать общий пример. Скажем, то, что у меня есть функция, вызванная 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 строка могла содержать любое количество объектов - текстовые поля, флажки, и т.д. Таким образом, я хочу создать родовой объект, сделайте ее из того же типа как строка выше ее, затем добавьте его к новой ячейке, затем к новой строке, затем к таблице.
Я протестировал его полностью, и единственная часть, которую мой код приводит к сбою на лжи в этом динамическом поколении типа объекта. Следовательно, почему я спросил о копировании объектов. Ни одно из решений, отправленных до сих пор, не работает правильно, между прочим. Спасибо за Вашу справку до сих пор, возможно, эта дополнительная информация поможет предоставить консультацию?
Вы не можете этого сделать вообще. И это не будет хорошей идеей, например, если параметр
имеет тип, реализующий одноэлементный шаблон. Если параметр
имеет тип, поддерживающий копирование, он должен реализовывать интерфейс 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
Вы можете реализовать что-то вроде этого:
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
Вот простой класс, который будет работать для большинства объектов (предполагается как минимум .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