2009-07-09 4 views
1

다양한 형식으로 내보낼 수있는 몇 가지 항목이 있습니다.변환 및 열거가 필요한 열거 형 대체

[Flags] 
public enum ExportFormat 
{ 
    None = 0x0, 
    Csv = 0x1, 
    Tsv = 0x2, 
    Excel = 0x4, 
    All = Excel | Csv | Tsv 
} 

문제는 이러한 열거 할 수 있어야한다는 것입니다 그리고 그들은 또한 UI의 번역 또는 설명을 필요 : 현재 우리는 다음과 같이 열거으로 표시 이러한 형식을 가지고있다. 현재 저는 두 가지 확장 메소드를 작성하여이를 해결했습니다. 그들은 작동하지만, 나는 그 (것)들 또는 해결책을 전혀 진짜로 좋아하지 않는다 ... 냄새 나는 종류 느낀다. 문제는 내가 어떻게 더 잘할 수 있는지 정말로 모른다는 것이다. 누구든지 좋은 대안이 있습니까? 이 두 가지 방법은 다음과 같습니다.

public static IEnumerable<ExportFormat> Formats(this ExportFormat exportFormats) 
    { 
     foreach (ExportFormat e in Enum.GetValues(typeof (ExportFormat))) 
     { 
      if (e == ExportFormat.None || e == ExportFormat.All) 
       continue; 

      if ((exportFormats & e) == e) 
       yield return e; 
     } 
    } 

    public static string Describe(this ExportFormat e) 
    { 
     var r = new List<string>(); 

     if ((e & ExportFormat.Csv) == ExportFormat.Csv) 
      r.Add("Comma Separated Values"); 

     if ((e & ExportFormat.Tsv) == ExportFormat.Tsv) 
      r.Add("Tab Separated Values"); 

     if ((e & ExportFormat.Excel) == ExportFormat.Excel) 
      r.Add("Microsoft Excel 2007"); 

     return r.Join(", "); 
    } 

이 방법을 사용하는 것이 좋습니다. 어떻게 내가 이것을 리팩토링 할 수 있을까?

+0

해당 문자열을 지역화 할 필요가 없습니까? 그렇다면 어쨌든 리소스 파일에있을 것이므로 코드에 _anywhere_를 삽입 할 필요가 없습니다. –

+0

참. 그러나 열거 형과 리소스 키를 연결하는 방법이 필요합니다. – Svish

답변

5

당신은 내부에 다음과 같이 여러 장소에서 모든 비트 연산을 수행하지 않도록 설명 [포맷 방법을 사용할 수 있습니다 , 위의 암시.

+0

Smart :) – Svish

1

유일한 다른 방법은 내 마음에 System.Attribute 클래스 사용입니다.

public class FormatDescription : Attribute 
{ 
    public string Description { get; private set; } 

    public FormatDescription(string description) 
    { 
     Description = description; 
    } 
} 

그런 다음 설명 기능에서 반사 기능을 사용하십시오. 이 방법의 유일한 이점은 한 곳에서 정의와 설명을 갖는 것입니다.

private static Dictionary<ExportFormat, string> FormatDescriptions = 
    new Dictionary<ExportFormat,string>() 
{ 
    { ExportFormat.Csv, "Comma Separated Values" }, 
    { ExportFormat.Tsv, "Tab Separated Values" }, 
    { ExportFormat.Excel, "Microsoft Excel 2007" },    
}; 

public static string Describe(this ExportFormat e) 
{ 
    var formats = e.Formats(); 
    var descriptions = formats.Select(fmt => FormatDescriptions[fmt]); 

    return string.Join(", ", descriptions.ToArray()); 
} 

이 방법, 외부 소스 또는 지역화에서 문자열 설명을 통합하기 쉽습니다 :

+0

런타임시 조회가 변경되지 않으므로 캐시 할 수 있으며 설명에 대한 반복 호출에 리플렉션을 사용하면 비용이 많이 듭니다. – adrianbanks

+0

이것은 현지화하기 어려울 것입니다, 그렇지 않습니까? 이후로 나는 속성을 사용할 때 자원 문자열 등을 실제로 찾을 수 없다는 것을 알고있다. – Svish

0

속는 : 지정한 자원에서 그들을 찾아 속성을 읽는 TypeConverter를 쓸 수

How do I have an enum bound combobox with custom string formatting for enum values?. 따라서 많은 번거 로움없이 표시 이름을 다국어로 지원할 수 있습니다.

TypeConverter의 ConvertFrom/ConvertTo 메서드를 살펴보고 리플렉션을 사용하여 열거 형 필드의 특성을 읽습니다.

추가 : 아래로 전체 지원을 위해 필요한 사항의 일부를 수행하는 TypeConverter를의 구현을위한 링크 된 게시물에

스크롤합니다.

이것은 코드 이름 -> 영어 이름뿐만 아니라 동시에 여러 언어를 사용하는 응용 프로그램을 지원합니다.

이것은 표시 이름 일 뿐이며 저장된 값이 아닙니다. 동일한 데이터를 사용하는 로케일이 다른 사용자를 지원하려면 항상 코드 이름 또는 정수 값을 저장해야합니다.

+0

관련 질문에 잘 붙잡 았지만 (나는 알지 못합니다), 그 질문에 대한 더 높은 등급의 답변에 동의하는 경향이 있습니다. 커스텀 TypeConverter를 만들면 열거 형을 문자열로 표현하는 방법을 효과적으로 변경하여 잠재적으로 직렬화와 같은 작업을 수행 할 수 있습니다. 나는 GetDescription과 NicenessComboBoxItem 아이디어를 좋아한다. –