C# 如何创建一个数据类型,该数据类型是另一个数据类型的可能值的子集

C# 如何创建一个数据类型,该数据类型是另一个数据类型的可能值的子集,c#,C#,如何创建只允许其他数据类型的特定值的数据类型。例如,假设我想创建一个类型,该类型限制为50个状态作为字符串。我该怎么做呢?使用enum,然后使用helper函数,我觉得有点不舒服 编辑:我想现在添加这个已经晚了,但是编译时错误检查解决方案是理想的。对于您的特定示例,枚举确实是最好的解决方案。对于更复杂的问题,可以使用工厂方法。下面是一个例子: public class State { public string Name { get; private set; } private

如何创建只允许其他数据类型的特定值的数据类型。例如,假设我想创建一个类型,该类型限制为50个状态作为字符串。我该怎么做呢?使用
enum
,然后使用helper函数,我觉得有点不舒服


编辑:我想现在添加这个已经晚了,但是编译时错误检查解决方案是理想的。

对于您的特定示例,枚举确实是最好的解决方案。对于更复杂的问题,可以使用工厂方法。下面是一个例子:

public class State
{
   public string Name { get; private set; }

   private State(string name)
   {
      this.Name = name;
   }

   public static State CreateState(string name)
   {
      // validate and throw error if invalid
      return new State(name);
   }
}

使用类,并且只允许构造函数中的特定值。这样就不可能创建具有错误值的类实例。(使用枚举不会将值限制为仅指定的值。)

简单的例子:

public class Paint {

  public string Name { get; private set; }

  public Paint(string name) {
    switch (name) {
      case "Red":
      case "Green":
      case "Blue":
        Name = name;
        break;
      default:
        throw new ArgumentException("Illegal paint name '" + name + "'.");
    }
  }

}

在内部,您可以将该值表示为字符串或枚举,这取决于您希望如何使用它。

不过,这就是方法。@TylerCormpton最好将这50个状态组织在一个枚举中?我的意思是,按主题,按概念。。。我想还有比这更好的设计。这正是a的用途——一组有限的不同值。
enum
实际上允许每个数字,无论定义与否。这一点都不受限制。确切地说<代码>枚举在.NET中没有很好地实现,因此对于特定情况,有更好的解决方案。也许你可以更详细地描述一下你的需求。。。例如,您是否有一些附加数据,如名称、说明、详细信息、数据项中的其他成员?+1您还可以为所有可能的值提供单例,例如
public State Indiana=new State(“Indiana”),等等。我猜你是想让
CreateState
成为静态的?你为什么不让构造函数抛出这个错误?@TylerCrompton-是的,我本想让它成为静态的。就我个人而言,我不喜欢在传入没有明显错误的数据时从构造函数抛出异常。如果传入一个
null
,或数组索引的负值,等等,这是一回事。但是如果你要一个字符串,我给你一个字符串,我希望它能起作用。也就是说,如果愿意,您当然可以从构造函数中抛出异常。