Пока общепринятая практика должна реализовать ICloneable
интерфейс (описал здесь , таким образом, я не извергну), вот хорошее глубокое копировальное устройство объекта клона, которое я нашел на Проект Кода только что и включил его в наш материал.
, Как упомянуто в другом месте, это действительно требует Вашим объектам быть сериализуемым.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
///
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
///
public static class ObjectCopier
{
///
/// Perform a deep Copy of the object.
///
/// The type of object being copied.
/// The object instance to copy.
/// The copied object.
public static T Clone(T source)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", nameof(source));
}
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
}
идея состоит в том, что это сериализирует Ваш объект и затем десериализовывает его в новый объект. Преимущество - то, что Вы не должны интересоваться о клонировании всего, когда объект становится слишком сложным.
И с использованием дополнительных методов (также из источника, на который первоначально ссылаются):
В случае, если Вы предпочитаете использовать новое дополнительные методы из C# 3.0, измените метод для имения следующей подписи:
public static T Clone(this T source)
{
//...
}
Теперь вызов метода просто становится objectBeingCloned.Clone();
.
РЕДАКТИРОВАНИЕ (10 января 2015) Мысль я пересмотрел бы это, чтобы упомянуть, что я недавно начал использовать (Newtonsoft) Json, чтобы сделать это, это должно быть легче и избегает издержек [сериализуемых] тегов. ( NB @atconway указал в комментариях, что члены парламента, не занимающие официального поста не клонированы с помощью метода JSON)
///
/// Perform a deep Copy of the object, using Json as a serialisation method. NOTE: Private members are not cloned using this method.
///
/// The type of object being copied.
/// The object instance to copy.
/// The copied object.
public static T CloneJson(this T source)
{
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
// initialize inner objects individually
// for example in default constructor some list property initialized with some values,
// but in 'source' these items are cleaned -
// without ObjectCreationHandling.Replace default constructor values will be added to result
var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source), deserializeSettings);
}
Методы document.open/write/close будут делать то, что вы хотите:
var newDoc = document.open("text/html", "replace");
newDoc.write(myString);
newDoc.close();
Если вы не передадите параметр replace, вызов document.open добавляет историю страниц. Поэтому пользователям придется дважды щелкнуть назад, чтобы перейти на предыдущую страницу.
Вы можете просто вырезать теги html, а затем поместить все внутри элемента html:
$('html').html(myString.replace(/<html>(.*)<\/html>/, "$1"));