C#10泛型方法中如何基于泛型参数T的类型实现switch匹配
报错原因
你当前switch的判断对象是typeof(T),它返回的是System.Type类的实例,而你写的case Axis axis:是用来匹配「值本身为Axis类型实例」的模式,两者类型完全不匹配,因此触发编译报错。
正确实现方案
方案1:基于Type实例匹配(兼容原有写法逻辑)
直接在case中加入类型判断的when子句即可:
public T GetAxis<T>(object axisObject) { switch (typeof(T)) { case Type t when t == typeof(Axis): // 执行对应逻辑,示例为直接转换返回 return (T)axisObject; // 其他类型分支按相同格式添加即可 case Type t when t == typeof(string): return (T)(object)axisObject.ToString(); default: throw new NotSupportedException($"暂不支持{typeof(T).Name}类型的匹配"); } }
方案2:泛型模式匹配(C# 10+推荐,无反射性能更好)
不需要反射获取Type实例,直接基于泛型类型做模式匹配,运行效率更高:
public T GetAxis<T>(object axisObject) { return default switch { Axis => (T)axisObject, // 其他类型分支按相同格式添加即可 int => (T)(object)Convert.ToInt32(axisObject), _ => throw new NotSupportedException($"暂不支持{typeof(T).Name}类型的匹配") }; }
如果编译器版本较低无法自动推断default的类型,把default改为default(T)即可正常编译。
内容的提问来源于stack exchange,提问作者Eric Snyder
相关产品推荐
相关产品推荐

