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

5

假设我有一个类型为System.Reflection.MethodInfo的对象,如何提取泛型参数的约束条件?不知道为什么我找不到有用的信息。


这个答案可能会对你有所帮助:如何确定ParameterInfo是否为泛型类型? - Domysee
2个回答

6

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

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

然而,请注意这并不完全对应于C#的泛型类型约束 - 还有一些余地。但是,如果您只关心例如基础类型约束,那么它将很好地工作 :)
例如,有趣的是,class 实际上根本不是类型约束,而 struct 被“翻译”为 System.ValueType(这也不太令人惊讶)。new() 也不是类型约束,因此此方法无法找到它。
如果您还需要考虑这些约束,请在 Select 中使用 GenericParameterAttributes 属性。例如,struct 约束将给出 NotNullableValueTypeConstraint | DefaultConstructorConstraint

谢谢你的回答!这正是我在寻找的。我不知道如果我有一个方法类型(从表示类的类型中检索)我仍然需要获取方法定义。我以为类类型已经返回方法定义,但显然它并没有??? - Regis May
1
@RegisMay 在这里关键词是Generic - 通用方法定义不如你手头上的具体(实例化)方法定义具体。这适用于通用类型和通用方法。例如,如果您列出一个未实例化的通用类型的所有通用方法,您将得到所期望的通用方法定义,并且可以跳过GetGenericMethodDefinition调用。如果有疑问,请问自己 - 我能调用此方法(或实例化一个类型)吗? 如果答案是肯定的,那么你的方法(或类型)是实例化的,你需要获得更通用的方法(或类型)。 - Luaan

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接