2012-04-02 182 views
0

假設我有以下類型的代碼:如何從現有實例創建相同類型的新實例?

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可能是不同的類型。 如何實現此請求?

+1

可能類似於這裏的討論有關克隆對象:http://stackoverflow.com/questions/78536/cloning-objects-in-c-sharp – 2012-04-02 20:04:14

+0

這是不可能在一般情況下,你將不得不對你想要克隆的對象做出一些假設......只要你認爲你的對象是可序列化的,surfen的回答就非常好。 – Yaur 2012-04-02 21:06:08

回答

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(); 
} 
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; 
} 
相關問題