如何从现有实例创建相同类型的新实例
本文关键字:实例 新实例 同类型 创建 | 更新日期: 2023-09-27 18:29:43
假设我有以下类型的代码:
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是动态数据,当MyList更改时,x可能是不同的类型。如何实现此请求?
我使用以下扩展方法:
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;
}