如何实现支持null的引用类型与值类型的类型检测?
问题原因
你遇到的编译报错核心原因是 ValueType本身是引用类型,并非值类型(struct):
- C# 中所有值类型确实都继承自
ValueType,但ValueType自身的类型归类是class(引用类型),不符合FromValueType<T>要求的T : struct泛型约束。 - Switch 分支中拿到的
oValueType静态编译类型是ValueType,编译器无法从这个引用类型的参数,推断出符合struct约束的泛型参数T,因此直接报错。
可行实现方案
值类型的具体类型只有运行时才能确定,因此需要通过反射构造对应类型的泛型方法再调用,参考实现如下:
public static int From(object o) { // 处理null的情况 if (o == null) return 0; Type runtimeType = o.GetType(); // 值类型分支 if (runtimeType.IsValueType) { // 构造对应具体值类型的封闭泛型方法 var fromValueTypeMethod = typeof(MyModule) // 替换为你定义这两个方法的实际类名 .GetMethod(nameof(FromValueType), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) .MakeGenericMethod(runtimeType); return (int)fromValueTypeMethod.Invoke(null, new object[] { o }); } // 引用类型分支 else { // 如果FromClassType逻辑不依赖具体T,直接传object即可 return FromClassType<object>(o); // 如果需要用实际运行时类型构造泛型方法,参考值类型的反射逻辑实现即可 } }
内容的提问来源于stack exchange,提问作者Ente
相关产品推荐
相关产品推荐

