如何从现有实例创建相同类型的新实例?

时间:2012-04-02 19:57:44

标签: c# entity-framework-4 wcf-ria-services

假设我有以下类型的代码:

foreach(var x in Mylist)  //MyList is EntitySet
{
//......
}

我想知道x的类型并创建另一个相同类型的新实例,并将clone 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可以是不同的类型。 如何实现这个要求?

2 个答案:

答案 0 :(得分:3)

我使用以下扩展方法:

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();
}

答案 1 :(得分:0)

你可以像这样动态创建类的对象。

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;
}