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()Webコントロールを呼び出すのに安全かどうかです。これまでに行ったことは、次のようなメソッドを追加することです

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 に答える