C# 在自定义服务器控件上调用MemberwiseClone()是否安全?

C# 在自定义服务器控件上调用MemberwiseClone()是否安全?,c#,asp.net,custom-server-controls,C#,Asp.net,Custom Server Controls,我已经编写了一个自定义服务器控件,它(伪代码)看起来像 public class MyCustomCtrl : WebControl { private Button innerCtrl; //some arbitrary object, doesn't matter ... protected override void CreateChildControls() { //initialization etc, as standard... }

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

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

   ...

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

   }

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

无论如何,解释使用的上下文有点困难。然而,我的主要问题是使用“克隆”是否安全,特别是在web控件上调用
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控件层次结构是一个相当复杂的模型。因此,我想听听你们中的一些人是否知道这种解决方案可能会出现的任何缺点。

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

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


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

hm。我已经使用模板开发了控件,实际上上面的一个用于包装repeater控件的控件上下文。简单地说,用户在ParentControl上定义一次控件“MyCustomCtrl”,该控件在内部包装了一个转发器。因此,在处理repeater的ItemTemplate时,我必须复制MyCustomCtrl并将其附加到每个RepeaterItem(行)。这就是为什么我需要复制功能。