必需名稱空間:
using System.Reflection;
using System.Collections.Generic;
方法:
private readonly static object _lock = new object();
public static T cloneObject<T>(T original, List<string> propertyExcludeList)
{
try
{
Monitor.Enter(_lock);
T copy = Activator.CreateInstance<T>();
PropertyInfo[] piList = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (PropertyInfo pi in piList)
{
if (!propertyExcludeList.Contains(pi.Name))
{
if (pi.GetValue(copy, null) != pi.GetValue(original, null))
{
pi.SetValue(copy, pi.GetValue(original, null), null);
}
}
}
return copy;
}
finally
{
Monitor.Exit(_lock);
}
}
這不是以任何方式特定於Silverlight - 它只是普通的Reflection。
正如所寫的,它只能用於具有無參數構造函數的對象。要使用需要構造函數參數的對象,您需要傳入一個帶有參數的對象[],並使用Activator.CreateInstance方法的不同重載,例如
T copy = (T)Activator.CreateInstance(typeof(T), initializationParameters);
的propertyExcludeList參數是您希望從副本排除,如果要複製所有屬性只是傳遞一個空的列表例如屬性名稱的列表
new List<string>()
這是基於序列化的,它會在不可序列化的類上工作嗎? – Kira
可能不是。 http://msdn.microsoft.com/en-us/library/ms731923(v=vs.110).aspx –
我這樣想,謝謝你的鏈接 – Kira