NotSupportedException克隆.NET CF中的Panel控件

时间:2013-05-23 08:10:10

标签: c# compact-framework clone

在我的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'。

为什么会这样?有没有办法避免它?

1 个答案:

答案 0 :(得分:1)

我认为不应该以这种方式复制数据类型不是值类型(或具有值类型语义)的任何属性。对于这些类型的属性,请尝试实现深度克隆/复制。但是,必然会有一些必须过滤掉的属性。

关于Font,事实证明Font类支持IClonable,所以我还建议您测试它,并且应该使用Clone方法复制其类型支持它的任何属性