我需要一种将过滤器添加到页面的方法,如下所示:
目录/尺寸-中/颜色-红色/
我有一定数量的过滤器,它们包含不太可能很快改变的属性。为了处理这些过滤器,我决定使用枚举,但这变得非常阴险,因为我需要合并空值、扩展方法和其他属性。
最后我遇到了这个建议使用结构的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);
}
这些工作很好,但他们只是在某些方面感觉不正确。例如,我必须为每个结构编写相同的代码,这看起来像是很多代码。继承可重用代码并以某种方式将数据限制为接口会容易得多。
有没有更好的方法来做到这一点?我尝试过使用静态类,但不知道如何构建一个与我的结构具有相似功能的类。
抱歉,如果我在发帖时似乎没有希望,这是我的第一次。