2009-09-04 4 views
0

나는 지금 내가이 사용자 지정 서버 컨트롤을 복사해야하는 경우가 사용자 정의 서버 컨트롤에서 MemberwiseClone()을 호출해도 안전합니까?

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 컨트롤 계층 구조는 상당히 복잡한 모델이라는 것을 의미합니다. 그래서 저는 그러한 해결책으로 생길 수있는 단점을 아는 사람들이 있는지 듣고 싶었습니다.

답변

2

아니요, 매우 일반적인 이유로 안전한 작업은 아닙니다. MemberwiseClone은 전체 복사본이 아닌 얕은 복사본입니다.

ViewState와 같은 것은 원래 컨트롤과 복제본간에 공유됩니다. 그러나 컨트롤 컬렉션도 공유되므로 원래 컨트롤 컬렉션의 변경 내용이 복제본에 전파됩니다. 그리고 컨트롤은 상태 (스타일, 이벤트 등)를 유지하기 위해 더 많은 숨겨진 참조를 사용하므로 MemberwiseClone은 매우 위험한 일입니다.

컨트롤을 일종의 템플릿으로 재사용하는 유일한 방법은 실제로 새 컨트롤 계층을 만드는 InstantiateIn 메서드가있는 템플릿 (ITemplate)을 사용하는 것입니다. 이 작업을 수행하는 리피터와 같은 컨트롤을 살펴 보시기 바랍니다.

+1

흠. 내가 예상 한 것입니다. 템플릿을 사용하여 컨트롤을 이미 개발했으며 실제로 리피터 컨트롤을 래핑하는 컨트롤의 컨텍스트에서 위의 컨트롤을 사용합니다. 간단히 말해서 사용자는 내부적으로 중계기를 래핑하는 ParentControl에서 컨트롤 "MyCustomCtrl"을 정의합니다. 따라서 Repeater의 ItemTemplate을 처리 할 때 MyCustomCtrl을 복사하여 각 RepeaterItem (기본적으로 행)에 연결해야합니다. 그것이 복사 기능이 필요한 이유입니다. – Juri

관련 문제