2012-02-15 6 views
5

현재 일부 필드가있는 일종의 사용자 지정 .NET을 만들어야하는 도구에서 작업하고 있습니다. 내가 어떤 접근 방식은이 문제를 해결하는 것이 좋습니다 궁금했는데, 다음과 같은 옵션에서 생각하고 :.NET 컨트롤 기능 확장

옵션 A : - 각 컨트롤에 대한 파생 클래스를 만듭니다 (의 말을하자 CLabel, CGroupBox ...) 여기서 각 클래스의 새 필드를 정의합니다. 이것은 의 악영향을 의미하지만으로 작동하기 쉽습니다.

예 :

class CLabel: Label 
{ 
    public List<Control> RelatedControls {get; set;} 
    public String textHint; 
    // more stuff... 

    public CLabel() 
    {} 
} 

옵션 B : -이 옵션은 각 컨트롤에서 파생 클래스를 생성하지만, 실제 라벨, 그룹 상자 등의 컨트롤을 사용하여 캡슐화하는 클래스를 생성하지 의미 모든 "추가"속성. 이 여분의 속성 개체는 Control.Tag 속성에서 참조됩니다. Tag 속성 내에서 일종의 복잡한 객체를 참조하는 것이 나에게 약간의 기이함을 느끼기 때문에이 질문에 대한 의문점이 있지만이 은 더 나은 유지 가능성을 의미 할뿐 아니라 컨트롤 서브 클래 싱을 필요가 없습니다..

예 :

Label lbl = new Label(); 
lbl.Tag = new ControlDescription(); 

옵션 C : -이 유형의 ControlDescription 필드를 추가 예를 CLabel을 위해, 옵션 A와 B는 그냥 사용자 지정 컨트롤을 만드는 조합의 일종을 가지고 의미 Label 컨트롤에 추가합니다. 이렇게하면 캡슐화와 mantainability가 보장되지만 Tag 것은 피할 수 있습니다.

저는 그보다 훨씬 많은 옵션이 있다는 것을 확신합니다. 아마 다형성 - 아마도 내가 가진 문제 -를 가지고있는 것만으로도 커스텀 컨트롤 클래스를 없앨 수있다. 그 중에서 가장 좋은 옵션은 무엇입니까? 이 모든 것이 더 잘 될 수 있다고 생각합니까?

답변

2

당신은 디자인 타임에 속성을 쉽게 제어가 필요하고이 http://msdn.microsoft.com/en-us/library/system.componentmodel.iextenderprovider.aspx

에서 당신은 잠금 장치가 있어야 윈도우 형태의 당신이 그 (것)들에게 먼저 컨트롤을 포장하지 않고 다른 컨트롤 속성을 제공 할 수있는이 길을 갈해야합니다.

+0

감사합니다. 이것 또한 살펴 보겠습니다. –

1

내가 올바르게 이해한다면 확장 방법을 사용하는 것이 좋습니다. 각 컨트롤에 대한 사용자 정의 값을 저장해야하는 경우 정적 사전 (Control, Value)에 저장하고 확장 메소드를 사용하여 액세스 할 수 있으므로 일부 값이 추가 된 컨트롤이있는 것처럼 보입니다."

public class ExtensionData 
{ 
    //put your data here 
} 

public class Extended<T> 
    where T : Control 
{ 
    public Extended(T baseControl) 
    { 
     BaseControl = baseControl; 
    } 

    public T BaseControl { get; set; } 

    public ExtensionData Extension { get; set; } 
} 

그것은 당신처럼 : 아마 당신이 시도 할 수

Button btn = new Button(); 
string s = btn.GetString(); 
+0

일종의 Dictionary를 사용하면 좋은 해결책이 들리며 .NET 컨트롤을 확장 할 필요가 없습니다. 잘못하지 않았다면 말입니다. 확장 메서드를 살펴 보겠습니다. 확장 메서드는 모름입니다. –

0

:

public static class Extension 
{ 
    private static Dictionary<Control, string> _controlStrings; 

    public static void GetString(this Control ctrl) 
    { 
     return _controlStrings[ctrl]; 
    } 
} 

당신 같은이 방법을 사용할 수 있습니다 그 후 :

는 예를 들어 추가 옵션 B "를 사용하지만"태그 "속성은 사용하지 않음