0

在我的 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; }
}

当我克隆面板控件并且循环到达“字体”属性时,出现异常

带有 InnerException 的“System.Reflection.TargetInvocationException”:“System.NotSupportedException”。

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

4

1 回答 1

1

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

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

于 2013-05-24T11:49:33.570 回答