如何让C#泛型方法支持传入未绑定泛型接口作为类型参数?
问题解答
没办法直接让方法1的instance.GetInterfaceGenericValueType<IHello<>>()调用生效,核心问题出在C#语法不允许把未绑定泛型类型(比如IHello<>)作为泛型方法的类型参数。
原因说明
C#里的泛型类型参数要求必须是完整的类型——要么是普通具体类型,要么是已经指定了类型参数的泛型类型(比如IHello<string>)。而IHello<>属于未绑定的泛型定义,本质是个类型模板,不是能直接使用的完整类型,所以没法当作泛型参数传递。但typeof(IHello<>)能正常工作,是因为它走的是反射路线,直接拿到CLR里代表这个模板的Type对象,不受泛型参数的语法限制。
变通方案
要是不想用方法2那种传typeof的写法,可以用个小技巧间接实现类似的调用体验:
// 自动提取泛型定义的版本 public static IEnumerable<Type> GetInterfaceGenericValueType<T>(this Type type) { var targetGenericDef = typeof(T).IsGenericType ? typeof(T).GetGenericTypeDefinition() : typeof(T); return type.GetInterfaces() .Where(a => a.IsGenericType && a.GetGenericTypeDefinition() == targetGenericDef) .SelectMany(a => a.GetGenericArguments()); }
调用时传入一个带具体类型参数的泛型接口(比如IHello<int>)即可,方法内部会自动提取它的泛型定义去匹配目标接口:
instance.GetInterfaceGenericValueType<IHello<int>>();
这种写法不用手动写typeof(IHello<>),调用形式更贴近你想要的方法1。
总结
如果非要严格使用GetInterfaceGenericValueType<IHello<>>()这种语法,目前C#完全不支持,只能选择方法2或者上面的变通方案。
内容的提问来源于stack exchange,提问作者Sebastien Lachapelle
相关产品推荐
相关产品推荐

