次のようなページにフィルターを追加する方法が必要でした。
カタログ/サイズ-ミディアム/カラー-レッド/
一定量のフィルターがあり、すぐに変更される可能性が非常に低いプロパティが含まれています。これらのフィルターを処理するために列挙型を決定しましたが、null、拡張メソッド、およびその他のプロパティを組み込む必要があるため、これは非常に陰湿になりました。
最後に、構造体の使用を提案するこのStackoverflowの回答に出くわしました。これが私が組み込んだものの例です:
public struct Color
{
private int id;
private bool isDef;
private Color(int value) { id = value; isDef = true; }
public bool Hasvalue { get { return isDef; } }
public bool IsNull { get { return !isDef; } }
public string Name
{
get
{
switch(id)
{
case 0: return "None";
case 1: return "Black";
case 2: return "Blue";
case 3: return "Green";
case 4: return "Orange";
case 5: return "Pink";
case 6: return "Brown";
case 7: return "White";
case 8: return "Yellow";
case 9: return "Gray";
case 10: return "Purple";
case 11: return "Red";
default: return null;
}
}
}
public string Abbreviation
{
get
{
switch(id)
{
case 1: return "BK";
case 2: return "BL";
case 3: return "GR";
case 4: return "OR";
case 5: return "PK";
case 6: return "BN";
case 7: return "WT";
case 8: return "YL";
case 9: return "GY";
case 10: return "PR";
case 11: return "RD";
default: return null;
}
}
}
public static IEnumerable<Color> GetValues()
{
yield return Color.None;
yield return Color.Black;
yield return Color.Blue;
yield return Color.Green;
yield return Color.Orange;
yield return Color.Pink;
yield return Color.Brown;
yield return Color.White;
yield return Color.Yellow;
yield return Color.Gray;
yield return Color.Purple;
yield return Color.Red;
}
public static Color Parse(string value)
{
if (String.IsNullOrEmpty(value))
return Color.None;
foreach (var c in GetValues())
{
if (String.Equals(c.Name, value, StringComparison.Ordinal))
return c;
}
return Color.None;
}
public override bool Equals(object obj)
{
if(!(obj is Color))
return false;
Color color = (Color)obj;
return color.Name.Equals(this.Name, StringComparison.Ordinal);
}
public static Color None = new Color(0);
public static Color Black = new Color(1);
public static Color Blue = new Color(2);
public static Color Green = new Color(3);
public static Color Orange = new Color(4);
public static Color Pink = new Color(5);
public static Color Brown = new Color(6);
public static Color White = new Color(7);
public static Color Yellow = new Color(8);
public static Color Gray = new Color(9);
public static Color Purple = new Color(10);
public static Color Red = new Color(11);
}
これらはうまく機能しますが、何らかの形で正しく感じられません。たとえば、構造体ごとに同じコードを作成する必要がありますが、これは多くのコードのようです。再利用可能なコードを継承し、何らかの方法でデータをインターフェイスに制限する方がはるかに簡単です。
これを行うためのより良い方法はありますか?静的クラスを使用してみましたが、構造体と同様の機能を備えた静的クラスを作成する方法について頭を悩ませることができませんでした。
投稿に絶望的だと思われる場合は申し訳ありませんが、初めてです。