Рейтинг@Mail.ru

Как программно создать копию экземпляра класса в .NET

Чтобы создать копию экземпляра класса в приложении .NET, его нельзя просто присвоить значению другого объекта. Как известно, классы в .NET относятся к ссылочному типу, и при присваивании объекта другому объекту, будет присвоена только ссылка на исходный объект. А при попытке изменить какое-то из полей или свойств вновь созданного объекта, изменится соответствующее поле или свойство исходного объекта. Поэтому, как вариант, можно поступить так (код на VB.NET):

Public Shared Function GetCopy(ByVal myOriginalObject As MyObject) As MyObject

  'Получаем список публичных свойств экземпляра типа MyObject:'
  Dim props() As PropertyInfo = myOriginalObject.GetType.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
  Dim myObjectCopy As New MyObject
 
  'Копируем значения всех свойств, доступных для записи:'
  For Each pi As PropertyInfo In props
    If pi.CanWrite Then
      Dim value As Object = pi.GetValue(myOriginalObject, Nothing)
        pi.SetValue(myObjectCopy, value, Nothing)
      End If
    Next
 
    Return myObjectCopy
 
End Function

Можно воспользоваться и таким решением:

Dim newObj as Object = obj.MemberwiseClone()

Нужно учесть, что этот метод MemberwiseClone() копирует объект не полностью. Члены значимого типы копируются, а ссылочного – нет, копируется только ссылка.

Поделиться