2012-10-02 1 views
1

아마도 다른 전략이 있지만 많은 값을 설정할 수있는 설정 응용 프로그램이 있습니다. 각 유형의 컨트롤 (텍스트 상자, 확인란, 콤보 상자, datagridivew)에 사용자가 값을 편집 할 때마다 설정된 IsDirty 플래그가 있으면 편리하다고 생각했습니다.C#, 상속없이 모든 데이터 입력 컨트롤에 일반 속성을 추가 할 수 있습니까? (확장 방법과 비슷합니다.)

당연히 각 사용자 컨트롤을 래핑 할 수 있지만 확장 메서드 또는 이와 비슷한 방법으로 이러한 각각의 사용자 컨트롤을 만들지 않아도되는 방법이 있는지 궁금합니다.

의견이 있으십니까?

감사 매트

답변

4

체크 아웃 객체에 속성을 "추가"를 사용할 수 있도록 설계되었습니다 .NET의 ConditionalWeakTable. 이 확장 방법과 효과적으로 사용될 수있다 :

ConditionalWeakTable 사용의 가장 큰 장점은 당신이 제대로 스레드 안전 및 가비지 수집을 처리하는 동안 UserControl이와 모든 .NET 클래스를 래핑하는 것을 피할 수 있다는 것입니다
public static class DirtyExtensions { 
    private class ExtraPropertyHolder { 
     public bool IsDirty { get; set; } 
    } 

    private static readonly ConditionalWeakTable<Control, ExtraPropertyHolder> _isDirtyTable 
     = new ConditionalWeakTable<Control, ExtraPropertyHolder>();  

    public static bool IsDirty(this Control @this) { 
     return _isDirtyTable.GetOrCreateValue(@this).IsDirty; 
    } 

    public static void SetIsDirty(this Control @this, bool isDirty) { 
     _isDirtyTable.GetOrCreateValue(@this).IsDirty = value; 
    } 
} 

(약한 참조를 통해).

+1

전에는 절대로 ConditionalWeakTable을 보지 못했습니다. 대답이 아닐지라도 훌륭한 TIL 자료입니다. – FMM

2

사용자가 WinForm 랜드에있는 것처럼 들리므로이 시나리오에서는 사용자 지정 extender provider (sample implementation)이 제대로 작동 할 수 있습니다. 기본적으로 컨트롤 개체에서 파생 된 개체 (모든 컨트롤)에 속성을 추가하고 속성이 설정된 경우 동작을 처리합니다.

+0

+1 좋은 정보. 인터페이스 정의를 가리 키도록 링크를 변경했습니다. –

관련 문제