簡介
雖然在現實世界中的克隆課題是有爭議的
為實現一個類你究竟有多少次要實現ICloneable接口
這是我的類得以存在的原因
·查看一下類中的每一個字段是否支持ICloneable接口
如果某字段不支持ICloneable接口
如果該字段支持ICloneable接口
如果該字段支持IEnumerable接口
如何使用
讓你的類支持Icloneable接口所要做的就是
public class MyClass : BaseObject
{
public string myStr =
public int id;
}
public class MyContainer : BaseObject
{
public string name =
public MyClass[] myArray= new MyClass[
public class MyContainer()
{
for(int i=
{
this
}
}
}
現在在Main方法中加入如下代碼
static void Main(string[] args)
{
MyContainer con
MyContainer con
con
}
當監測con
BaseObject類的完整實現代碼
/// <summary>
/// BaseObject類是一個用來繼承的抽象類
/// 每一個由此類繼承而來的類將自動支持克隆方法
/// 該類實現了Icloneable接口
/// 支持Icloneable接口
/// </summary>
public abstract class BaseObject : ICloneable
{
/// <summary>
/// 克隆對象
/// </summary>
/// <returns>引用新的克隆對象</returns>
public object Clone()
{
//首先我們建立指定類型的一個實例
object newObject = Activator
//我們取得新的類型實例的字段數組
FieldInfo[] fields = newObject
int i =
foreach (FieldInfo fi in this
{
//我們判斷字段是否支持ICloneable接口
Type ICloneType = fi
if (ICloneType != null)
{
//取得對象的Icloneable接口
ICloneable IClone = (ICloneable)fi
//我們使用克隆方法給字段設定新值
fields[i]
}
else
{
// 如果該字段部支持Icloneable接口
fields[i]
}
//現在我們檢查該對象是否支持IEnumerable接口
//我們還需要枚舉其所有項並檢查他們是否支持IList 或 IDictionary 接口
Type IEnumerableType = fi
if (IEnumerableType != null)
{
//取得該字段的IEnumerable接口
IEnumerable IEnum = (IEnumerable)fi
Type IListType = fields[i]
Type IDicType = fields[i]
int j =
if (IListType != null)
{
//取得IList接口
IList list = (IList)fields[i]
foreach (object obj in IEnum)
{
//查看當前項是否支持支持ICloneable 接口
ICloneType = obj
if (ICloneType != null)
{
//如果支持ICloneable 接口
//我們用它李設置列表中的對象的克隆
ICloneable clone = (ICloneable)obj;
list[j] = clone
}
//注意
//在克隆列表的項將與原列表對應項相同
//(只要該類型是引用類型)
j++;
}
}
else if (IDicType != null)
{
//取得IDictionary 接口
IDictionary dic = (IDictionary)fields[i]
j =
foreach (DictionaryEntry de in IEnum)
{
//查看當前項是否支持支持ICloneable 接口
ICloneType = de
GetInterface(
if (ICloneType != null)
{
ICloneable clone = (ICloneable)de
dic[de
}
j++;
}
}
}
i++;
}
return newObject;
}
}
From:http://tw.wingwit.com/Article/program/net/201311/13699.html