2009-04-02 9 views
1

나는 가능한 값을 열거있어 : 제네릭은이 클래스 디자인의 솔루션입니까?

public enum Language 
    { 
     English = 1, 
     French = 2, 
     German = 3 
    } 

지금 난 내 클래스는 열거 목록을 기반으로 여러 값에 대한 수용 할 수 있다는 점에서 동적되고 싶어요. 따라서 열거 형 목록이 커지면 모든 가능한 값을 얻을 수 있습니다.

public class Locale 
    { 
     public string EnglishValue { get; set; } 
     public string FrenchValue { get; set; } 
     public string GermanValue { get; set; } 
    } 

하지만 난 열거 목록 (또는 목록)이 커질 경우 다시 컴파일 할 필요가 나던 뭔가를 원하는 : 여기

내 초기 설계 보이는 방법

public class Locale 
    { 
     public string StringValue<T> Where T : Language 
    }  
: 그것은 같은 것을 표현하는 것이 가능

이 문제를 잘 처리 할 수있는 제안이나 디자인 패턴에 대해 열려 있습니다. 감사합니다.

답변

1

그냥 사전을 사용하십시오.

public class Locale : Dictionary<Language, string> 
{ 
} 

당신이 열거를 변경하면 무슨 일이 있어도, 당신은 다시 컴파일해야합니다,하지만 당신은 아마 의미하는 것은 Locale 클래스를 "유지"입니다.

+0

오른쪽 : 나는 유지 보수를 말합니다 : p –

0

당신이 제안하는 것은 불행히도 효과가 없을 것입니다.

public class Locale 
{ 
    public string GetStringValue(Language language) 
    { 
     // return value as appropriate 
    } 
} 
0

일반 매개 변수를 입력 매개 변수 값이 아닌 매개 변수 및 (적어도 C#에서) 열거 멤버는 고유 한 값이 아닌 종류가 있습니다 : 이것은 더 나은 설계 이럴 것이다. 열거 형 (이 경우, 언어)은 실제로 유형이지만 구성원은 아닙니다.

또한 generic 클래스는 Language에서 상속 된 형식 매개 변수를 가지고 있지만 열거 형은 C#에서 상속받을 수 없으므로 this 및 제네릭 형식 매개 변수 제약 조건 ("where T : Langauge" 함께 제네릭 형식 매개 변수는 항상 모든 경우에 "언어"가 될 것이므로이 경우 제네릭 클래스가없는 것은 아닙니다. 내가 당신이라면, 나는 이런 짓을 했을까 :

public class Locale 
{ 
    public string GetStringValue(Language language) 
    { 
     // ... 
    } 
} 
0

어쩌면 그것은 수업을하고 선택 System.Globalization.CultureInfo가하는 것처럼 언어 별 처리의 일부를 incapsulate하는 언어에 대한 더 나은?

0

다른 답변에 동의하는 동안 물론 언어 목록 사전을 사용할 수 있지만 런타임시 로컬 구성이나 데이터베이스에서 채워서 다시 컴파일 할 필요없이 확장 성을 제공합니다.

관련 문제