C# 将属性赋值限制为C中的一组常量#

C# 将属性赋值限制为C中的一组常量#,c#,C#,比如说我有财产 public string RestrictedString {get; set;} 我定义了几个静态常量字符串 public const string String1 = "First String"; public const string String2 = "Second String"; 有没有办法只允许将受限字符串分配给String1或String2? 希望这会有所帮助。从概念上讲,您希望有一个新类型,所以请创建一个表示有效值的新类型。在您的情况下,您希望您的类型

比如说我有财产

public string RestrictedString {get; set;}
我定义了几个静态常量字符串

public const string String1 = "First String";
public const string String2 = "Second String";
有没有办法只允许将受限字符串分配给String1或String2?


希望这会有所帮助。

从概念上讲,您希望有一个新类型,所以请创建一个表示有效值的新类型。在您的情况下,您希望您的类型只有两个可能的有效值,因此请构造这些值,不要再构造任何值:

public class SomeMeaningfulName
{
    private SomeMeaningfulName(string value)
    {
        Value = value;
    }

    public string Value { get; }

    public static SomeMeaningfulName String1 = new SomeMeaningfulName("First String");
    public static SomeMeaningfulName String2 = new SomeMeaningfulName("Second String");
}

现在,您可以将该属性的类型更改为新类型,并且知道它只是这两个值中的一个(您可以从中获取字符串值)。

使用
DescriptionAttribute
将其设置为可枚举的,我所看到的最好方法是通过类型安全的字符串枚举模式。您可以看到实现的详细信息。是的,检查Set上的值,如果不正确,则抛出。如果需要类型安全性,则每个字符串都应该是某个基类的密封类。不,没有任何方法可以真正防止不允许的字符串,除非你在设置和抛出时检查它们。即使枚举也不易受攻击,因为您可以将任何适用的值强制转换为枚举,无论它是否具有指定的值<代码>枚举foo{bar=1;}foo-whoops=(foo)9001是完全有效的代码。@YuriyFaktorovich您知道使用枚举是否会弄乱entityframework吗?@A_Rominger这是另一个问题,但可能会对您有所帮助。枚举中的名称无效。抱歉,忘记了空格。Fixed@BviLLe_Kid现在代码已经编译,字符串不是OP需要的字符串。@Servy更新了我的答案如果你的答案与公认的答案相似,为什么不将这个问题标记为重复的?@BviLLe_Kid你为什么不将这个问题标记为重复的,如果你发现了一个重复的问题?在我研究在枚举中存储常量变量之前,我发布了一个答案,当时我遇到了Description属性,这导致一个问题的答案与你发布的问题的答案类似。@b维尔孩子,那么当你最终找到重复的答案时,为什么不将答案标记为重复的呢?为什么你认为没有看到重复的人会将问题作为他们没有发现的问题的重复关闭?因为我已经看到,用户只关心为自己赢得更多的声誉,即使他们的答案相似,甚至在他们看到/没有看到的问题上完全相同。。我不是特别说你,但我以前见过。不过,我已将该问题标记为重复问题。
public class SomeMeaningfulName
{
    private SomeMeaningfulName(string value)
    {
        Value = value;
    }

    public string Value { get; }

    public static SomeMeaningfulName String1 = new SomeMeaningfulName("First String");
    public static SomeMeaningfulName String2 = new SomeMeaningfulName("Second String");
}