必需的命名空间:
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 所特有的——它只是普通的反射。
如所写,它仅适用于具有无参数构造函数的对象。要使用需要构造函数参数的对象,您需要传入一个带有参数的 object[],并使用 Activator.CreateInstance 方法的不同重载,例如
T copy = (T)Activator.CreateInstance(typeof(T), initializationParameters);
propertyExcludeList 参数是您希望从副本中排除的属性名称列表,如果您想复制所有属性,只需传递一个空列表,例如
new List<string>()