You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何将基于Equals方法的if-else语句转换为switch语句?

当然可以!从C# 7.0开始,我们就能用switch语句处理这类类型判断的场景,甚至在C# 9.0+里写法会更简洁。你的原代码用Equals判断FieldType,完全可以转换成switch写法——因为CLR中每个类型对应的Type实例是全局单例的,typeof(int)这类表达式返回的是唯一实例,所以直接匹配的效果和Equals判断完全一致。

转换后的代码(C# 9.0+ 推荐写法)

switch (fi.FieldType)
{
    case typeof(int):
        fi.SetValue(data, BitConverter.ToInt32(buffer, 0));
        break;
    case typeof(bool):
        fi.SetValue(data, BitConverter.ToBoolean(buffer, 0));
        break;
    case typeof(string):
        byte[] tmp = new byte[la.length]; // 假设la是你定义的长度变量
        Array.Copy(buffer, tmp, tmp.Length);
        fi.SetValue(data, System.Text.Encoding.UTF8.GetString(tmp)); // 根据实际编码调整
        break;
    // 可按需添加更多类型的case
    default:
        // 处理未匹配的类型,比如抛出异常或跳过
        throw new NotSupportedException($"不支持的字段类型:{fi.FieldType.Name}");
}

兼容C# 7.0-8.0的写法

如果你的项目还在使用较老的C#版本,可以用when条件匹配:

switch (fi.FieldType)
{
    case Type t when t == typeof(int):
        fi.SetValue(data, BitConverter.ToInt32(buffer, 0));
        break;
    case Type t when t == typeof(bool):
        fi.SetValue(data, BitConverter.ToBoolean(buffer, 0));
        break;
    case Type t when t == typeof(string):
        byte[] tmp = new byte[la.length];
        Array.Copy(buffer, tmp, tmp.Length);
        fi.SetValue(data, System.Text.Encoding.UTF8.GetString(tmp));
        break;
    default:
        throw new NotSupportedException($"不支持的字段类型:{fi.FieldType.Name}");
}

额外说明

  • 两种写法的核心逻辑和你原有的if-else完全等价,因为fi.FieldType == typeof(T)和fi.FieldType.Equals(typeof(T))的判断结果一致(Type类重写了Equals方法,且单例特性保证引用相等)。
  • 如果是C# 6及更早的版本,没办法直接用switch做这种类型匹配,建议用字典映射的方式替代:把Type作为键,对应的处理逻辑封装成委托作为值,比如:
var typeHandlers = new Dictionary<Type, Action<FieldInfo, object, byte[]>>
{
    { typeof(int), (fi, data, buf) => fi.SetValue(data, BitConverter.ToInt32(buf, 0)) },
    { typeof(bool), (fi, data, buf) => fi.SetValue(data, BitConverter.ToBoolean(buf, 0)) },
    { typeof(string), (fi, data, buf) => 
      {
          byte[] tmp = new byte[la.length];
          Array.Copy(buf, tmp, tmp.Length);
          fi.SetValue(data, System.Text.Encoding.UTF8.GetString(tmp));
      }
    }
};

if (typeHandlers.TryGetValue(fi.FieldType, out var handler))
{
    handler(fi, data, buffer);
}
else
{
    throw new NotSupportedException($"不支持的字段类型:{fi.FieldType.Name}");
}

内容的提问来源于stack exchange,提问作者Bhrathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:42:31