2012-04-18 3 views
3

VS 나는 기본 클래스일반 양식 및 디자이너

internal partial class View<T> : UserControl 
    where T : class 
{ 
    protected T t; 
} 

을하고 난보기

internal partial class ViewChild<T> : View<T> 
    where T : class 
{ 
} 

이 확인 작업에서 아이를 도출 할,하지만 난 VS 디자이너 ViewChild을 편집 할 수 없습니다. 문제가 일반적인 기본 클래스라는 것을 알고 있습니다. 그러나 나는이 경우 어떻게 피할 수 있는지 이해하지 못한다. 문제를 해결할 방법이 있습니까?

답변

2

Generic은 형식이없는 클래스를 인스턴스화 할 수 없으므로 디자이너를 중단합니다. T. 내 블로그 게시물에서 해결 방법을 설명합니다

당신 ca n은 다음 조건부 DEBUG 또는 RELEASE 컴파일러 스위치를 기반으로 코드에서이 클래스를 전환 :

#if DEBUG 

namespace MyNamespace 
{ 
    using System; 


    public partial class CustomerEditorControl_Design : BaseEditorControl<Customer> 
    { 
     public CustomerEditorControl_Design() 
      : base() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

#endif 

    public partial class CustomerEditorControl 
#if DEBUG 
     : CustomerEditorControl_Design 
#else 
     : BaseEditorControl<Customer> 
#endif 
    { 
    } 

이 불행하게도 당신이 을 설계 할 수 없을 것입니다, 당신은 CustomerControl의 파생 클래스를 열어 드릴 것입니다 서명의 제네릭을 사용한 UI 제어. 내 솔루션은 파생 된 항목의 디자인 만 가능하게합니다.

이 경우 CustomerControl : BaseControl<Customer>이 작동하지 않는 이유는 모르겠지만 T 유형이 정의되어 있지만 간단히 말해서 아닙니다. 일반적인 사용 규칙 때문에 추측하고 있습니다.

Microsoft는 방어를 위해이 기능이 지원되지 않는다고 말합니다.

+0

내가 알기로 이것은 콘크리트 고객 유형에서만 작동하며 다른 유형의 ViewChild를 사용하려면 작동하지 않습니다.보기 에 기본 코드가 있는데, 일부 추가 코드로 을 확장하면 View , ViewChild , ViewChild 등이 표시됩니다. – wince

+0

@wince 올바른 것입니다. 대답에서 말한 것처럼 파생 된 형태의 문제 만 해결합니다. 실제로 컨텐트가있는 일반 기본 폼이 있다면 그 아이디어를 비닝하고 셸 형식으로 컴포지션을 수행하는 것이 좋습니다. 필자의 사용법에서는 기본 컨트롤이 시각적 인 것이 아니라 논리 만 제공했습니다. –

+0

@wince'View '및'ViewChild '도 시각적 요소가 있습니까? 아니면 그냥 코드입니까? –

3

다른 방법이있다, 그것은 컴파일러 플래그에 의존하지 않습니다

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

정말 조건부 컴파일의 사용을 조언하지 않을 것입니다. 프레임 워크를 사용하는 것이 훨씬 더 좋습니다.

기본적으로 VS에 기존 프레임 워크를 통해 다른 클래스를 부여 할 수 있습니다. 디자이너에게 다른 클래스를 사용하도록 VS에 알려주는 TypeDescriptionProvider 특성으로 기본 클래스를 꾸미십시오.

원본 블로그 게시물에서 언급했듯이이 해결 방법과 관련된 경고가있을 수 있지만 일반적인 기본 클래스에서 상속 된 25 개 이상의 UserControls가있는 프로젝트에서 제대로 작동하고 있습니다.

+0

그것은 좋은 해결책이지만 제네릭은 언급하지 않습니다. 제네릭을 사용 했습니까? –

+0

문제 도메인은 실제로 동일합니다. 즉, 디자인 된 유형의 인스턴스를 호스팅하는 VS입니다. VS가 generics에 대해 설명하는 이유는 추상 클래스처럼 그것들을 인스턴스화 할 수 없다는 것입니다. 이 점에서 모든 제네릭은 의사 추상입니다. 유형 매개 변수 없이는 런타임에 아무런 의미가 없습니다. 질문에 대답하기 위해 필자는 Winforms에서 강력하게 형식화 된 뷰의 미완성 구현을 위해 간단히 일반 기본 클래스를 사용했지만 현재로서는 실제 아키텍처를 구현하기 위해 특정 아키텍처 전환을 중단했습니다. 나는 아마 그 달의 끝으로 돌아갈 것이다. –

+0

+1 이번 주말에 시간을 내면 오래된 코드를 업데이트하려고합니다. 기본 클래스를 디자인 할 수 있는지 확인하십시오. 좋은 찾기. –

관련 문제