是否可以知道某个类是否已使用扩展方法进行了扩展?

时间:2012-05-30 14:33:45

标签: c# vb.net extension-methods

在VB.NET或C#中,有没有办法确定某个类是否已使用extension methods进行扩展?

3 个答案:

答案 0 :(得分:7)

编辑:现在问题已经改为引用扩展方法(可能是也可能不是OP的意图) - 不,你不知道类型是否是扩展方法的目标,除非它是一个静态类(除非你知道所有相关的潜在组件,否则它不能以这种方式使用。

扩展方法只是静态非泛型顶级类型中的静态方法,用属性修饰。你有效地询问这种方法是否存在。您可以迭代所关注的所有程序集中的所有方法,以尝试找到针对该类型的扩展方法,但这就是全部。


原始答案,当问题未提及扩展方法时

如果您知道可能扩展到的所有程序集,您可以使用Assembly.GetTypesType.IsSubclassOf检查每个程序集。

如果类是未密封的并且不包含内部抽象成员(即可以扩展),那么您无法判断其他一些卸载的程序集是否包含子类,否。每个班级“知道”其父母,但不知道其子女。

答案 1 :(得分:2)

如果某个课程受到保护或公开,实际上无法确定该课程是否得到延长。

如果要在装配内或流程内(所有已加载的装配)确定,可以使用Type.IsSubclassOfType.IsAssignableForm进行检查。

如果要在解决方案中确定编译时(不实际执行),只需将构造函数设为私有,或将类标记为已密封,编译解决方案,并检查所有相关错误。完成后,还原更改。

答案 2 :(得分:1)

无法知道是否已使用扩展方法扩展了类。可以将扩展方法看作是在不同项目中仅以微弱和不同方式附加到类的静态过程。

扩展方法不会创建任何新类型,并且永远不会覆盖真正的成员方法(因此在您开始直接调用它们之前,它们不能以任何方式更改对象的行为)。因此,您可能不会需要来检测它们的存在。

可以确定特定方法是扩展方法还是真正的成员方法。也可以使用反射列出特定加载程序集中的所有扩展方法。这解释为here