【问题标题】:Is it possible to know if a class has been extended with extension methods? [duplicate]是否可以知道一个类是否已使用扩展方法进行了扩展? [复制]
【发布时间】:2012-05-30 14:33:44
【问题描述】:

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

【问题讨论】:

  • 你指的是扩展方法还是继承?无论哪种方式,这两种选择实际上都得到了回答,哈哈
  • @Rabskatran:这并没有真正回答问题。您的问题已由 Meta-Knight 编辑以提及扩展方法,但我们不知道这是否是您的真正意图。
  • 我在问题中添加了一个链接以使其清楚。

标签: c# vb.net extension-methods


【解决方案1】:

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

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


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

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

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

【讨论】:

  • 感谢您的双重回答 :-) 我从两者都学到了。
【解决方案2】:

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

如果您想在程序集中,或在进程内(所有已加载的程序集)确定,可以使用Type.IsSubclassOfType.IsAssignableForm 进行检查。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 2010-12-05
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多