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

本文关键字:提取 方法 约束 反射 | 更新日期: 2023-09-27 18:22:17

给定类型为System.Reflection.MethodInfo的对象,如何提取泛型参数约束?不知怎么的,我找不到关于这方面的合理信息。

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

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

method
.GetGenericMethodDefinition()
.GetGenericArguments()
.Select(i => i.GetGenericParameterConstraints())
.Dump();

然而,请注意,这并不是100%对应于C#的泛型类型约束——还有一点回旋余地。尽管如此,如果你只关心例如基本类型约束,它会很好地工作:)

例如,有趣的是,class实际上根本不是类型约束,而struct被"翻译"为System.ValueType(并不太令人惊讶)。new()也不是一个类型约束,所以这个方法无法找到它。

如果还需要考虑这些约束,请使用Select中的GenericParameterAttributes属性。例如,struct约束将为您提供NotNullableValueTypeConstraint | DefaultConstructorConstraint

您可能正在寻找Type.GetGenericParameterConstraints方法()

返回一个Type对象数组,该数组表示当前泛型类型参数。

也可键入.GetGenericArguments方法()

返回一个Type对象数组,该数组表示封闭泛型类型或泛型类型的类型参数定义