开启类型变量

5

感觉这应该很容易,但我就是想不出来怎么让它工作。

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有什么原因吗? - user5940189
这对问题有影响吗?@Orangesandlemons - Patrick Hofman
2
这是我目前正在做的事情,但当你有大约12个“else if”时,你开始思考这是否应该是一个switch。 - Flynn1179
3个回答

3

好的,我的初始答案是错误的。在类型开关中,您无法这样做(除非使用when,但我认为这种用法很糟糕)。问题是Type不是常量,因此您无法在开关中使用它。

我之前的误解是因为您没有使用实际值而是使用了Type实例。您必须继续使用if语句。


不是很好看。为了减少代码重复,使用字典可能会有帮助。 - Patrick Hofman
我仍然不明白为什么 typeof(byte) 不被视为常量。或者说,为什么 typeof(anything) 不是常量呢? - Flynn1179
因为类实例不能是常量。@Flynn1179 - Patrick Hofman
@DannyChen null 不是一个实例,它代表的是缺少一个实例。 - Patrick Hofman
@DavidArno 谢谢 - Patrick Hofman
显示剩余3条评论

2
你可以使用 switch 实现这个功能,只需要使用 var 模式和 when 保护:
Type propType = propertyInfo.PropertyType;
switch (propType)
{
    case var b when b == typeof(byte):
        // Do something
        break;
}

0

如果您决定在 Type 上使用 switch,我认为您的选择很少,而且都相当糟糕。

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

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

这种方法的局限性非常严重,因为它仅支持{{link1:TypeCode枚举}}中的少数内置类型。

另一个选择是根据类型名称进行切换:

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

这也不是很好,因为您必须编写包括命名空间的完整名称,名称未经拼写检查等。 switch 也将接受“假”的 System.Byte 类型(即自定义类型命名为 System.Byte,而不是 .Net 中包含的类型)。


1
@downvoter,您认为这个答案有什么问题吗? - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接