将字符串参数约束为特定类

时间:2018-04-15 04:25:23

标签: c# string parameters parameter-passing constants

这可能是一个令人难以置信的愚蠢问题但是:我有一个接受字符串的函数,我想确保字符串是特定类的常量。基本上我正在寻找的效果是枚举:

enum MyEnum {...}
void doStuff(MyEnum constValue) {...}

除了字符串:

static class MyFakeStringEnum {
    public const string Value1 = "value1";
    public const string Value2 = "value2";
}
// Ideally:
void doStuff(MyFakeStringEnum constValue) {...}
// Reality:
void doStuff(string constValue) {...}

我知道这可以通过做一些像

这样的事情来实现
public static class MyFakeStringEnum {
    public struct StringEnumValue {
        public string Value { get; private set; }
        public StringEnumValue(string v) { Value = v; }
    }
    public static readonly StringEnumValue Value1 = new StringEnumValue("value1");
    public static readonly StringEnumValue Value2 = new StringEnumValue("value2");
}
void doStuff(MyFakeStringEnum.StringEnumValue constValue) {...}

但是制作一个只存储一个值的对象感觉有些过分。

如果没有额外的代码层和开销,这是否可行?

编辑:虽然枚举确实可以用于字符串,但我想避免使用它有几个原因:

  • 字符串值可能并不总是枚举的1:1转换。如果我有一个空格,不同的大小写,不同的字符集/语言等等,我必须在我想要使用它的每个函数中转换枚举。它可能不会有很多开销或性能损失,但仍然应该避免 - 特别是当它意味着我总是在变异应该是不变的。

  • 即使我使用单独的字符串数组映射来解决上述函数,我仍然需要访问翻译而不是直接使用枚举。地图也意味着有两个相同数据的来源。

  • 我对不同数据类型的这个概念感兴趣,例如。不能通过枚举名称轻易表示或存储为枚举值的浮点数,uluan等。

至于字符串 - >对我来说,首先使用枚举的意义在于我可以依靠智能感知给我一个存在的常数;我不想等到编译时或运行时才能找到答案。传入一个实际的字符串将是鸭子打字,这是我绝对不想用强类型语言做的事情。

1 个答案:

答案 0 :(得分:0)

我建议你创建一个枚举并将字符串值解析为枚举成员。 您可以使用Enum.Parse方法执行此操作。如果提供的值不是有效成员,则抛出ArgumentException。

export default (props) => {
  const store = configStore(props);
  return (
    <Provider store={store}>
      <Editor props={{ ...props }} />
    </Provider>
  )
}