0

我编写了一个自定义服务器控件,它(伪代码)看起来像

public class MyCustomCtrl : WebControl
{
   private Button innerCtrl; //some arbitrary object, doesn't matter

   ...

   protected override void CreateChildControls()
   {
      //initialization etc, as standard...

   }

}

现在我必须复制这个自定义服务器控件。基本上它是由程序员以声明方式添加到 aspx 或 ascx 代码上的。在运行时,必须创建该控件的多个实例,然后将其添加到某个父控件。然而,这是在该父控件的上下文中处理的。

无论如何,解释使用的上下文有点困难。然而,我的主要问题是使用“克隆”是否安全,尤其是调用MemberwiseClone()网络控件?到目前为止我所做的是添加一个类似的方法

public class MyCustomCtrl : WebControl
{
   ...

   public object Clone(){
      MyCustomCtrl clone = MemberwiseClone() as MyCustomCtrl;
      clone.InnerCtrl = this.innerCtrl.Clone() as Button; //or whatever type

      return clone;
   }
}

我的意思是 ASP.net 控件层次结构是一个相当复杂的模型。所以我想听听你们中的一些人是否知道这种解决方案可能出现的任何缺点。

4

1 回答 1

2

不,出于一个非常普遍的原因,这不是一个安全的操作:MemberwiseClone 是浅拷贝,而不是深拷贝。

所以像 ViewState 这样的东西在你的原始控件和克隆之间共享。但 Controls 集合也是共享的,因此对原始 Controls 集合的任何更改都会传播到克隆。并且控件使用更多的隐藏引用来维护状态(如样式、事件等),因此 MemberwiseClone 是一件非常危险的事情。

将控件作为一种模板重用的唯一方法是实际使用模板 ( ITemplate),它具有创建新控件层次结构的 InstantiateIn 方法。我建议你看看像Repeater这样的控件。

于 2009-09-04T22:46:05.493 回答