Как создать новый экземпляр того же типа из существующего экземпляра?
Предположим, у меня есть следующий вид кода:
foreach(var x in Mylist) //MyList is EntitySet
{
//......
}
Я хочу знать тип x и создать еще один новый экземпляр того же типа и клон x в новый экземпляр, например:
foreach(var x in Mylist)
{
string tyoename = typeof(x).AssemblyQualifiedName; //get the type of x, but i got error here
//create instance of the type
//clone x data to new instance
}
MyList - это динамические данные, x может быть другого типа при изменении Mylist. Как реализовать этот запрос?
2 ответа
Я использую следующий метод расширения:
public static class CloningExtensions
{
public static T Clone<T>(this T source)
{
// var dcs = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null);
var dcs = new System.Runtime.Serialization
.DataContractSerializer(typeof(T));
using (var ms = new System.IO.MemoryStream())
{
dcs.WriteObject(ms, source);
ms.Seek(0, System.IO.SeekOrigin.Begin);
return (T)dcs.ReadObject(ms);
}
}
}
Как это:
foreach(var x in Mylist)
{
var y = x.Clone();
}
Но вы должны быть осторожны с классами, которые не поддерживают сериализацию, потому что этот метод не вызывает конструктор и не инициализирует приватные поля. Я обхожу его, используя метод OnDeserializing/OnDeserialized (определенный для каждого типа, который мне нужно для клонирования)
[OnDeserialized]
private void OnDeserialized(StreamingContext c)
{
Init();
}
Вы можете создавать объекты класса динамически, как это.
T ReturnObject<T>(T x)
{
Type typeDynamic=x.GetType();
Type[] argTypes = new Type[] { };
ConstructorInfo cInfo = typeDynamic.GetConstructor(argTypes);
T instacneOfClass = (T)cInfo.Invoke(null);
return instacneOfClass;
}