考虑以下代码:
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; }
}
如何强制Sports类的Name属性仅使用其中一个PredifinedStrings?
编辑:我想避免使用枚举,因为值始终代表字符串。
答案 0 :(得分:5)
我建议改为使用enum
:
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()
。
答案 1 :(得分:1)
尝试类似:
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
,并将此逻辑包装在类中。此外,不是手动列出if()子句中的所有常量,而是可以拥有一个字符串数组,并检查其中是否包含value
。
很多其他方式。 :)
答案 2 :(得分:-1)
或者你可以创建一个Sports类的实例,因为另一个类是静态访问它的成员,使用它的完全限定的类名
Sports newSport = new Sports();
newSport.Name = PredefinedStrings.Basketball;
我个人建议使用枚举但是因为你问过如何访问静态类中的常量我发布了一个快速而肮脏的方式作为例子:)