0

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

4

3 回答 3

7

编辑:现在问题已更改为引用扩展方法(这可能是也可能不是 OP 的意图) - 不,您无法判断一个类型是否是扩展方法的目标,除非它是一个静态类(在这种情况下它不能那样使用),除非您知道所有相关的潜在程序集。

扩展方法只是静态非泛型顶级类型中的静态方法,用属性修饰。您实际上是在询问是否存在这种方法。您可以遍历您关心的所有程序集中的所有方法,以尝试找到针对该类型的扩展方法,但仅此而已。


原始答案,当问题没有提到扩展方法时

如果您知道它可能在其中扩展的所有程序集,您可以使用Assembly.GetTypesand来检查它们中的每一个Type.IsSubclassOf

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

于 2012-05-30T14:35:13.313 回答
2

如果一个类是受保护的或公共的,实际上没有办法确定它是否被扩展。

如果要确定在程序集中还是在进程中(所有加载的程序集),可以使用Type.IsSubclassOf或进行检查Type.IsAssignableForm

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

于 2012-05-30T14:42:53.010 回答
1

不可能知道一个类是否已经使用扩展方法进行了扩展。将扩展方法视为静态过程,仅在不同项目中以微弱且不同的方式附加到类。

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

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

于 2012-05-30T21:12:21.393 回答