2011-07-05 9 views
4

構造化された読み取り専用データを列挙型で保持していますが、構造体を拡張し、列挙型のすべての値に対して追加フィールドを追加したいと考えています。読み取り専用の構造化データを保持するのに最適な「場所」は何ですか?

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

と私はそうのようにそれらを拡張したい::だから、私のオリジナルenumがあるように

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

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

...と。

列挙型は多次元データ構造を保持することはできません。そのような構造化されたデータを保持するのに最も良い「場所」とは何が一般的に考えられますか? valuefilename、および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

はい、Value、Filename、およびIDプロパティを持つOutputFormatクラスを作成します。データを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; 
     } 
} 
関連する問題