表示常量字符串的C#类属性

本文关键字:属性 常量 字符串 表示 | 更新日期: 2023-09-27 18:24:56

考虑以下代码:

public static class PredefinedStrings
{
    public const string Golf = "Golfing";
    public const string Basketball = "Basketball";
    public const string HoolaHoops = "Hulahoops";
}

public class Sports 
{ 
   public string Name { get; set; }
}

How can I force the Name property of the Sports class to use only one of the PredifinedStrings?

Edit: I want to avoid using enums since the values always represent a string.

表示常量字符串的C#类属性

I would suggest using an enum instead:

public enum SportName { Golfing, Basketball };
public class Sports 
{ 
   public SportName Name { get; set; }
}

典型的任务是

var s = new Sports();
s.Name = SportName.Basketball;

即便如此,它也不会被强制执行,因为您仍然可以执行Name = (SportName)42;,但出错要困难得多——但您当然可以将自定义逻辑放入setter中,以过滤掉这些无效值。

此外,如果您需要枚举值的字符串表示,只需在其上使用ToString()即可。

尝试以下操作:

public class Sports 
{ 
   private string _name;
   public string Name
   {
       get { return _name; }
       set { if (value == PredefinedStrings.Golf
                 || value == PredefinedStrings.Basketball
                 || value == PredefinedStrings.Hulahoops)
              {
                  _name = value;
              }
              else
              {
                  throw new ArgumentException ("Invalid value");
              }
            }
   }
}

这是一个简单、天真的解决方案。一些调整包括创建自己的类(例如SportName),并使用它来代替string,并将此逻辑封装在类中。此外,您可以拥有一个字符串数组,并检查其中是否包含value,而不是手动列出if()子句中的所有常量

很多其他方式。:)

或者你可以创建一个Sports类的实例,因为另一个类是静态访问,所以它的成员可以使用它的完全限定类名

Sports newSport = new Sports();
newSport.Name = PredefinedStrings.Basketball;

就我个人而言,我建议使用枚举,但由于您询问了如何访问静态类中的常量,我发布了一个快速而肮脏的方法作为示例:)