C#类,其中一个属性可以具有两个字符串中的任意一个

C#类,其中一个属性可以具有两个字符串中的任意一个,c#,C#,如何将C#类中的属性设置为只允许包含两个字符串中的任何一个 例如,考虑这个类: class Route { private string color; } 如果我希望颜色只能是“深红色”或“浅蓝色”,我该怎么做 我尝试定义一个枚举,如下所示: public enum Color { "Dark red", "Light blue" } public class ColorString { private readonly string _value;

如何将C#类中的属性设置为只允许包含两个字符串中的任何一个

例如,考虑这个类:

class Route
{
    private string color;
}
如果我希望颜色只能是“深红色”或“浅蓝色”,我该怎么做

我尝试定义一个枚举,如下所示:

public enum Color
{
    "Dark red",
    "Light blue"
}
public class ColorString
{
    private readonly string _value;

    public static ColorString DarkRed = new ColorString("Dark bed");
    public static ColorString LightBlue = new ColorString("Light blue");

    private ColorString(string value)
    {
        _value = value;
    }

    public override string ToString()
    {
        return _value;
    }
}
然后使用它,而不是使用内置的string类,但它似乎不是正确的方式。

“它似乎不是正确的方式”并不是用正确的词来描述您在那里所做的事情

C#中的枚举由枚举文字而不是字符串文字组成

你基本上需要的是

public enum Color
{
    DarkRed,
    LightBlue
}
请在此处查看C#enum的参考:

如果您的属性必须是类型
String
,您可以实现枚举值和字符串之间的转换,(
返回colorValue.ToString();
colorValue=(Color)enum.Parse(typeof(Color),stringValue;
),但我建议将您的属性改为类型
Color

“这似乎不是正确的方式”不是用正确的词语来描述你在那里所做的事情

C#中的枚举由枚举文字而不是字符串文字组成

你基本上需要的是

public enum Color
{
    DarkRed,
    LightBlue
}
请在此处查看C#enum的参考:


如果属性的类型必须是
String
,则可以实现枚举值和字符串之间的转换(
返回colorValue.ToString();
colorValue=(Color)enum.Parse(typeof(Color),stringValue;
)但我建议您将属性改为
颜色类型。

使用枚举的替代方法如下:

public enum Color
{
    "Dark red",
    "Light blue"
}
public class ColorString
{
    private readonly string _value;

    public static ColorString DarkRed = new ColorString("Dark bed");
    public static ColorString LightBlue = new ColorString("Light blue");

    private ColorString(string value)
    {
        _value = value;
    }

    public override string ToString()
    {
        return _value;
    }
}
这相当于枚举,但保留字符串的值,并允许您向类型添加其他行为

如果您有雄心壮志,您甚至可以将其视为一根字符串:

public static implicit operator string(ColorString colorString)
{
    return colorString.ToString();
}
尽管这应该谨慎对待

如果必须是字符串,则可以通过属性setter在设置值时添加运行时检查。类似于:

public class Route
{
    private string _color;
    private readonly ISet<string> _validColors
        = new HashSet<string> {"Dark red", "Light blue"};

    public string Color
    {
        get { return _color; }
        set
        {
            if (_validColors.Contains(value))
                _color = value;
            else
                throw new ArgumentException("Invalid color");
        }
    }
}
公共类路由
{
私有字符串(颜色),;
专用只读ISet\u有效颜色
=新哈希集{“深红色”、“浅蓝色”};
公共字符串颜色
{
获取{return\u color;}
设置
{
如果(_validColors.Contains(value))
_颜色=值;
其他的
抛出新的ArgumentException(“无效颜色”);
}
}
}

但是,这不会阻止直接在
\u color
上设置值。

使用枚举的替代方法可能如下所示:

public enum Color
{
    "Dark red",
    "Light blue"
}
public class ColorString
{
    private readonly string _value;

    public static ColorString DarkRed = new ColorString("Dark bed");
    public static ColorString LightBlue = new ColorString("Light blue");

    private ColorString(string value)
    {
        _value = value;
    }

    public override string ToString()
    {
        return _value;
    }
}
这相当于枚举,但保留字符串的值,并允许您向类型添加其他行为

如果您有雄心壮志,您甚至可以将其视为一根字符串:

public static implicit operator string(ColorString colorString)
{
    return colorString.ToString();
}
尽管这应该谨慎对待

如果必须是字符串,则可以通过属性setter在设置值时添加运行时检查。类似于:

public class Route
{
    private string _color;
    private readonly ISet<string> _validColors
        = new HashSet<string> {"Dark red", "Light blue"};

    public string Color
    {
        get { return _color; }
        set
        {
            if (_validColors.Contains(value))
                _color = value;
            else
                throw new ArgumentException("Invalid color");
        }
    }
}
公共类路由
{
私有字符串(颜色),;
专用只读ISet\u有效颜色
=新哈希集{“深红色”、“浅蓝色”};
公共字符串颜色
{
获取{return\u color;}
设置
{
如果(_validColors.Contains(value))
_颜色=值;
其他的
抛出新的ArgumentException(“无效颜色”);
}
}
}

但这不会阻止直接在
\u color
上设置值。

属性具有getter和setter。如果您需要将属性限制为特定值,则可以使用枚举:

class Route
{
    private Color Color { get; set; }
}

public enum Color
{
    DarkRed,
    LightBlue
}
如果必须将其限制为2个字符串值:

class Route
{
    private string _color;
    public string Color
    {
        get
        {
            return _color;
        }
        set
        {
            switch (value)
            {
                case "First Valid Value":
                case "Second Valid Value":
                    _color = value;
                    break;
                default:
                    throw new ArgumentException("Invalid Value specified");
            }
        }
    }
}

属性具有getter和setter。如果您的要求是将属性限制为特定值,则可以使用枚举:

class Route
{
    private Color Color { get; set; }
}

public enum Color
{
    DarkRed,
    LightBlue
}
如果必须将其限制为2个字符串值:

class Route
{
    private string _color;
    public string Color
    {
        get
        {
            return _color;
        }
        set
        {
            switch (value)
            {
                case "First Valid Value":
                case "Second Valid Value":
                    _color = value;
                    break;
                default:
                    throw new ArgumentException("Invalid Value specified");
            }
        }
    }
}

但它似乎不是正确的方式。
是什么让你这么想的?Enum很好。
但它似乎不是正确的方式。
是什么让你这么想的?Enum很好。你可以将它与字符串表示的每个枚举值上的
描述属性
相结合。你可以将它与
描述属性
相结合字符串表示的每个枚举值上的属性。