在我的CF应用程序中,我使用以下代码来克隆控件:
private static T Clone<T>(T controlToClone)
where T : Control
{
try
{
PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
T instance = Activator.CreateInstance<T>();
foreach (PropertyInfo propInfo in controlProperties)
{
if (propInfo.CanWrite)
{
if (propInfo.Name != "WindowTarget")
propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
}
}
return instance;
}
catch (Exception e) { MessageBox.Show(e.InnerException.Message); return null; }
}
当我克隆一个Panel控件并且循环到达'Font'属性时,我得到一个异常
具有InnerException的'System.Reflection.TargetInvocationException': 的 'System.NotSupportedException'。
为什么会这样?有没有办法避免它?
答案 0 :(得分:1)
我认为不应该以这种方式复制数据类型不是值类型(或具有值类型语义)的任何属性。对于这些类型的属性,请尝试实现深度克隆/复制。但是,必然会有一些必须过滤掉的属性。
关于Font,事实证明Font类支持IClonable
,所以我还建议您测试它,并且应该使用Clone
方法复制其类型支持它的任何属性