2011-07-05 2 views
4

Я держу только структурированные данные только для чтения в перечисляемом типе, теперь я хотел бы расширить структуру и для каждого значения в enum добавить дополнительные поля. Таким образом, мое первоначальное перечисление:Какое лучшее «место» для хранения структурированных данных только для чтения?

public enum OutputFormats { Pdf, Jpg, Png, Tiff, Ps }; 

, и я хочу, чтобы расширить их так:

Value=Pdf 
FileName="*.PDF" 
ID=1 

Value=Jpg 
FileName="*.jpg" 
ID=2 

... и так далее.

Перечисление не может содержать многомерную структуру данных, так что, как правило, считается лучшим «местом» для хранения таких структурированных данных? Должен ли я создать класс с value, filename и id свойствами и инициализировать данные в конструкторе класса?

+0

Да, этот тип вещей обычно делается с использованием класса. Нет особого преимущества в использовании структуры, если вы не требуете, чтобы экземпляры имели семантику типа значения. –

+0

Это кажется слишком расплывчатым. Конечно, класс или структура будут работать, и если у вас нет каких-либо ограничений/требований, отличных от данных, предназначенных только для чтения, то это нормально. –

ответ

3

Возможно, это псевдо-перечисление шаблон будет полезен:

public class OutputFormats 
{ 
    public readonly string Value; 
    public readonly string Filename; 
    public readonly int ID; 

    private OutputFormats(string value, string filename, int id) 
    { 
     this.Value = value; 
     this.Filename = filename; 
     this.ID = id; 
    } 

    public static readonly OutputFormats Pdf = new OutputFormats("Pdf", "*.PDF", 1); 
    public static readonly OutputFormats Jpg = new OutputFormats("Jpg", "*.JPG", 2); 
} 

Другой вариант, возможно более краткий:

public class OutputFormats 
{ 
    public string Value { get; private set; } 
    public string Filename { get; private set; } 
    public int ID { get; private set; } 

    private OutputFormats() { } 

    public static readonly OutputFormats Pdf = new OutputFormats() { Value = "Pdf", Filename = "*.PDF", ID = 1 }; 
    public static readonly OutputFormats Jpg = new OutputFormats() { Value = "Jpg", Filename = "*.JPG", ID = 2 }; 
} 
+0

Извините, но ваш код инициализации значений содержит ошибки и не будет компилироваться. – Tomas

+0

@Tomas - Извините, я должен был сказать, что это код, скомпилированный мозгом. Вы должны уметь самостоятельно устранять ошибки синтаксиса, нет? –

+0

Готово, что уже;) – Tomas

2

Да, создайте класс OutputFormat со свойствами Value, Filename и ID. Вы можете хранить данные в XML-файле и анализировать XML-файл в List, или вы можете инициализировать объекты OutputFormat где-то в коде.

1
// using a string key makes it easier to extend with new format. 
public interface IOutputRepository 
{ 
    //return null if the format was not found 
    Output Get(string name); 
} 

// fetch a format using a static class with const strings. 
var output = repository.Get(OutputFormats.Pdf); 
2

Создание класса или структуры с только для чтения свойств и полей, как это:

struct OutputFormat 
{ 
     public int Id { get; private set; } 
     public OutputFormats Format { get; private set; } 
     public string Filename { get; private set; } 

     public OutputFormat(int id, OutputFormats format, string filename) 
     { 
      Id = id; 
      Format = format; 
      Filename = filename; 
     } 
} 
Смежные вопросы