【问题标题】:Switching on a type variable打开类型变量
【发布时间】:2017-09-22 04:48:32
【问题描述】:

感觉这应该很容易,但我只是看不出有什么办法让它发挥作用。

Type propType = propertyInfo.PropertyType;
switch (propType)
{
  case typeof(byte): // Can't do this, 'A constant value is expected'
    // Do something
    break;
}

我也试过了

private const byteType = typeof(byte);

并打开它,但由于同样的原因,这行代码无法编译。

那么,问题来了:如何开启Type 的实例?

【问题讨论】:

  • 您是否有不想使用 if/else 的原因?
  • 这个问题重要吗? @Orangesandlemons
  • 这就是我目前正在做的事情,但是当你有大约 12 个 else if 时,你开始想也许这应该是一个开关。

标签: c# switch-statement c#-7.0


【解决方案1】:

好的,我最初的回答是错误的。您不能在类型切换中执行此操作(如所指出的那样不使用when,在我看来这对于这种用途来说很糟糕)。问题是 Type 不是一个常量,所以你不能在 switch 中使用它。

我弄错了,因为您使用的不是实际值,而是Type 实例。你必须继续使用if 语句。

【讨论】:

  • 不幸的是,这不起作用。编译器失败并显示“类型类型的表达式无法由字节类型的模式处理。”
  • 嗯,它确实给了我一个想法,它有效,但是......case Type t where t == typeof(byte),但我觉得这并没有真正给十几个 if/else 语句带来任何真正的好处。
  • 不,确实。没那么漂亮。字典可能有助于减少代码重复。
  • 我仍然不明白为什么typeof(byte) 不被视为常量。或typeof(anything) 就此事。
  • 因为类实例不能是常量。 @Flynn1179
【解决方案2】:

您可以使用switch 做到这一点,您只需要使用var 模式和when 守卫:

Type propType = propertyInfo.PropertyType;
switch (propType)
{
    case var b when b == typeof(byte):
        // Do something
        break;
}

【讨论】:

    【解决方案3】:

    如果您打算在Type 上使用switch,我认为您的选择很少,都相当差。

    第一个选项是使用TypeCode,例如:

    switch (Type.GetTypeCode(propType))
    {
      case TypeCode.Byte:
        // Do something
        break;
    }
    

    这种方法受到严重限制,因为它只支持the TypeCode enum 中的少数内置类型。

    另一种选择是打开类型名称:

    switch (propType.FullName)
    {
      case "System.Byte":
        // Do something
        break;
    }
    

    这也不是很好,因为您必须编写包括命名空间在内的全名,不检查名称是否有拼写错误,这样 switch 也会接受“假”System.Byte 类型(即名为 @987654330 的自定义类型@,不是 .Net 中包含的那个)。

    【讨论】:

    • @downvoter 你认为这个答案有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2021-04-19
    相关资源
    最近更新 更多