C#: 发现扩展方法

5

您推荐哪些工具或技术,可以发现代码中的C#扩展方法? 它们在正确的命名空间中,但可能在解决方案的任何文件中。

具体来说:

  • 如何在代码窗口中找到当前类型上的所有扩展方法(并导航至它们)?

我确实有Resharper(v4),所以如果它有我不知道的机制-请分享!


没有使用 ReSharper 的爱。 - Sergey Mirvoda
1
我想知道为什么你需要这个?如果扩展方法被正确使用并且在正确的命名空间中,你可以看到它们,如果你应该看到它们,而如果你不需要它们,你就看不到它们。 - Stefan Steinegger
因为如果扩展方法位于不同的项目中,或者在一个单独的类文件中,命名空间就不足够了。 - Neil Barnwell
5个回答

5
如果您有源代码,那么可以使用正则表达式搜索 this Type identifier。考虑到它必须是函数的第一个参数,类似这样的内容应该可以解决问题:
\(this:b+:i:b+:i

至少这样你可以找到扩展方法定义的位置并添加该命名空间,然后依赖于智能感知。我在一个非常复杂的项目中运行了这个方法,并且它的表现非常好。唯一的假阳性是类似于这样的东西:

if(this is Blah...

我们可以通过在搜索中添加static来解决这个问题,因为扩展方法必须是静态的:
static.*\(this:b+:i:b+:i

这种情况下不起作用:

public
  static ExtensionMethod(
   this int
    iVal) {
}

但这是正则表达式的局限性。我相信某些人可以告诉你使用正则表达式解析语言时的痛苦。

现在,我认为IDE缺少的功能是识别非导入命名空间中的扩展方法的能力。类似于当您知道类名时,如果输入它,IDE将提示您明确使用它或导入命名空间。毕竟,这就是我导入所有命名空间的方式,并经常试图对扩展方法执行相同的操作。


static.*(this:b+:i:b+:i 对我来说不起作用,我在 Visual Studio 中找不到任何东西。我不理解表达式中的冒号和 i。我应该如何在启用正则表达式的 Visual Studio 搜索中使用它。对我有用的是使用 static.*(this\sMyType 进行搜索。 - donttellya

1

这很低技术含量,但是尝试使用Ctrl-F搜索"this:b+MyClassName"怎么样?


不幸的是,它通常并不那么简单。例如,如果你想要找到适用于int[]数组的所有扩展方法,那么你可能需要搜索this objectthis Tthis T[]this int[]this ICloneablethis IListthis ICollectionthis IEnumerablethis IList<T>this IList<int>this ICollection<T>this ICollection<int>this IEnumerable<T>this IEnumerable<int>。(当然,也没有保证扩展方法的泛型类型参数实际上会被命名为T而不是TFooTBar等等。) - LukeH

0

如果您正在使用VS,我猜您会使用智能感知功能来显示给定对象的所有可用扩展方法(标有蓝色小图标添加到常规实例方法图标中)。该列表可能因文件而异(在两个不同的文件中,名为aMethod的方法可能意味着两个不同的东西),即使对象类型相同(这是基于查找扩展方法的方式)。


只要你在类文件中包含了定义它们的命名空间。 - ChrisF
@chris OP所述的要求已经得到满足 :) 但是,如果您在不同的命名空间中具有相同名称的方法,并将这两个命名空间放入使用列表中,则情况会变得非常有趣。如果您不想改变代码的工作方式,请勿重新排序使用列表。 - Rune FS

0
如果你有resharper,只需按住ctrl键并点击方法即可。

1
没有Re#er,你可以把光标放在方法上,然后按F12 :) - Snake
哦,是的 :) - 忘记了那个 - Rob Fonseca-Ensor

0
如果您在Visual Studio中安装了ILSpy扩展(我使用的是2022版本),则可以执行以下操作:
  • 右键单击类/类型,然后选择 -> 在ILSpy中打开代码
  • 在ILSpy中,右键单击类型,然后选择 -> 分析
  • 在分析窗口中,您将看到一个节点“扩展方法”(如果存在,则显示该节点;否则不显示)

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