在C#中使用Equals方法的Switch case语句

5

有没有办法将以下if else条件转换为C#中的Switch语句。我正在使用Equals方法检查类型,但无法转换为switch case。

if (fi.FieldType.Equals(typeof(int)))
{
    fi.SetValue(data, BitConverter.ToInt32(buffer, 0));
}
else if (fi.FieldType.Equals(typeof(bool)))
{
    fi.SetValue(data, BitConverter.ToBoolean(buffer, 0));
}
else if (fi.FieldType.Equals(typeof(string)))
{
    byte[] tmp = new byte[la.length];
    Array.Copy(buffer, tmp, tmp.Length);
    fi.SetValue(data, System.Text.Encoding.UTF8.GetString(tmp));
}
else if (fi.FieldType.Equals(typeof(double)))
{
    fi.SetValue(data, BitConverter.ToDouble(buffer, 0));
}
else if (fi.FieldType.Equals(typeof(short)))
{
    fi.SetValue(data, BitConverter.ToInt16(buffer, 0));
}

请帮助我们...

该文本无需翻译。

2
是的,使用C# 7.0 - 模式匹配。 - Tim Schmelter
@TimSchmelter 没有必要进行模式匹配,代码检查 FieldType。常见的 switch 语句可以解决问题。 - Panagiotis Kanavos
@PanagiotisKanavos 但是如果你尝试将其与 typeof(x) 进行比较,编译器会抱怨你需要使用一个常量值。 - DavidG
@DavidG,那就有TypeCode。 - Panagiotis Kanavos
@Bhrathi 你为什么要这样做?这看起来像是反射代码。你是想要进行反序列化吗?可能已经有内置实现了你所需的功能。 - Panagiotis Kanavos
显示剩余2条评论
1个回答

11

使用 C# 7 的模式匹配,您可以这样做:

switch (fi.FieldType)
{
    case var _ when fi.FieldType.Equals(typeof(int)):
        fi.SetValue(data, BitConverter.ToInt32(buffer, 0));
        break;
    case var _ when fi.FieldType.Equals(typeof(bool)):
        fi.SetValue(data, BitConverter.ToBoolean(buffer, 0));
        break;

    //etc
}

请注意,这里使用 _ 丢弃该值,因为我们不关心它。


感谢您的快速回复。 - Bhrathi
你可以使用 Type.GetTypeCode 并在早期版本中使用 switch。 - Panagiotis Kanavos
@Bhrathi 这看起来像是反射代码。你真正想做什么?也许已经有人实现了这个。 - Panagiotis Kanavos
@PanagiotisKanavos 是的,这是假设它们都是CLR类型的情况下。 - DavidG
1
虽然这在技术上使用了 switch,但你仍然像使用 if else 链一样使用它。在 switch (fi.FieldType) 中未使用 fi.FieldType,你可以放置任何值。你只使用了 when boolean_evaluation 部分,这与 if(boolean_evaluation) 没有区别。这是其中一种情况,你改变语法以适应所提出的更改,而忽略了实际的根本原因。 - Flater
显示剩余4条评论

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