다수의 제로 값 문제가있는 플래그 열거 (TextFormatFlags)
문제
사용자 정의 컨트롤을 작성하려고하는 동안 System.windows.forms.textformatflags Enum의 문제가 발생했습니다. Visual Studio (2005/2008) 편집기. 이 문제의 이유는이 열거가 여러 멤버가 있다는 사실에서 비롯된 것 같습니다. 이 멤버를 선택하면 (GlyphoverHangPadding, Left, Default, Top)가 편집기가 속성을 설정합니다.
this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.GlyphOverhangPadding;
코드는 예상대로 컴파일됩니다. 그러나 편집기 속성 그리드에서 0이 아닌 멤버 (예 : "Right")를 선택하면 다음과 같은 결과가 있습니다.
this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right;
분명히 이것은 컴파일하지 않습니다. 0이 아닌 멤버가 두 명 이상 선택되면 (예 : "오른쪽 | 하단"을 통해) 다음과 같은 결과가 나옵니다.
this.customControl.TextFormatFlags = ((System.Windows.Forms.TextFormatFlags)((System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right | System.Windows.Forms.TextFormatFlags.Left, Default, Top, Bottom)));
보시다시피, 편집자는 선택한 항목에 4 명의 제로 가치 멤버 중 3 개를 추가합니다.
이 문제를 재현하려면 :
- Visual Studio 2005/2008에서 새 프로젝트 만들기 (Windows Forms Application)
- 프로젝트에 사용자 정의 컨트롤을 추가하십시오.
새로운 클래스에 개인 분야와 공공 재산을 추가하십시오.
Private TextFormatflags TFF = TextFormatflags.Default;
public textformatflags tffproperty {get {return this.tff; } set {this.tff = value; }}
코드를 컴파일하십시오
- Designer에서 Form1을 열고 CustomControl1을 추가하십시오.
- 코드는 정상적으로 컴파일됩니다
- 이제 편집기 속성 그리드에서 CustomControl1의 속성을 엽니 다.
- "기타"섹션 아래에 tffproperty가 표시됩니다.
- 이 숙박 시설은 몇 가지 값을 제공하며 대부분 쉼표가 포함되어 있습니다.
- 쉼표로 값을 선택하면 (예 : "왼쪽, 기본값, 상단, HorizontalCenter)가 편집 할 수없는 코드가 발생합니다.
플래그 속성으로 나만의 열거를 만들고 한 번 이상의 멤버를 0에 추가하는 경우 (이것은 일종의 오르플 링 플래그 열거입니까?) 마찬가지입니다. 나는 이것이 내가 사용하고있는 UityPeeditor의 버그가 아님을 확인했습니다 (UityPeeditor를 사용하지 않고 동일한 문제가 발생합니다). 나는 지금까지 성공하지 않고 컨버터로 문제를 우회하려고 노력했다. 이 문제를 해결하는 방법에 대한 아이디어가 있으면 기꺼이들을 수 있습니다.
해결책
나는 다양한 수업을 확인했다 System.ComponentModel.Design.Serialization
리플렉터를 사용하는 네임 스페이스를 사용하면 코드 시리얼 라이저가 약간 장난 꾸러기라고 생각합니다.
열거는 처리됩니다 EnumCodeDomSerializer.Serialize
, 그 목적은 열거를 가져다가 그것을 System.CodeDom.CodeExpression
디자이너 파일에서 보는 것을 나타내는 객체.
이 방법이 올바르게 사용됩니다 CodeBinaryOperatorExpression
처리하기 위해 |
표현의 측면. 그러나 개별 열거 값의 경우 사용합니다. Enum.ToString
~을 통해 EnumTypeConverter
결과 문자열을 표현식 트리에 직접 붙입니다.
제 생각에는 Enum.ToString
당신이보고있는 것의 궁극적 인 원인입니다.
다수의 열거 회원이 동일한 기본 값을 갖고 기본 값을 기준으로 열거 회원의 이름 표현을 검색하려고 시도한 경우, 코드가 반환 할 메소드 이름에 대한 가정을하지 않아야합니다.
MSDN 페이지가 켜져 있습니다 Enum.ToString
쉼표에 대해 이야기하지 않지만 여전히 출력에 의존하는 것이 안전하지 않은 것 같습니다. Enum.ToString
유효한 c# 표현식입니다.
이것이 당신의 통제에 어떤 의미가 있는지 잘 모르겠습니다.
- 분명히 당신은 자신의 교체를 정의 할 수 있습니다
TextFormatFlags
복제 된 제로 플래그없이 수행하십시오 - 사용자 정의 유형 변환기로 해킹 할 수 있습니다.
InstanceDescriptor
. 이를 통해 디자이너 생성 코드에 나타나는 내용을 조금 더 제어 할 수 있습니다. - 당신은 아마도 노출 될 수 있습니다
int
디자이너 세리어 라이저에게 aTextFormatFlags
속성 그리드에