如何在 C# 中通过反射提取泛型方法约束?

Reg*_*May 5 c# generics reflection generic-constraints

给定一个类型的对象,System.Reflection.MethodInfo如何提取通用参数约束?不知怎的,我找不到有关此的合理信息。

Lua*_*aan 6

您需要做的就是获取通用方法定义,并列出通用参数:

method
.GetGenericMethodDefinition()
.GetGenericArguments()
.Select(i => i.GetGenericParameterConstraints())
.Dump();
Run Code Online (Sandbox Code Playgroud)

但是,请注意,这并不 100% 对应于 C# 的泛型类型约束 - 存在一些回旋余地。不过,如果您只关心例如基本类型约束,它会很好地工作:)

例如,有趣class的是,实际上根本不是类型约束,而 whilestruct被“翻译”为System.ValueType(这并不奇怪)。new()也不是类型约束,因此此方法无法找到它。

如果您还需要考虑这些约束,请GenericParameterAttributes使用Select. 例如,struct约束会给你NotNullableValueTypeConstraint | DefaultConstructorConstraint