C#:发现扩展方法

C#:发现扩展方法,c#,visual-studio,extension-methods,C#,Visual Studio,Extension Methods,对于在代码中发现C#扩展方法,您推荐哪些工具或技术?它们位于正确的命名空间中,但可能位于解决方案中的任何文件中 具体而言: 如何在代码窗口中找到当前类型上的所有扩展方法(并导航到它们) 我有Resharper(v4),所以如果它有一个机制我不知道-请分享 这是相当低的技术含量,但是Ctrl-F搜索“This:b+MyClassName”怎么样?如果您使用的是VS,我猜您是intellisense,它将为您显示给定对象的所有Aviable extensionmethod(在常用的实例方法图标中

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

具体而言:

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

我有Resharper(v4),所以如果它有一个机制我不知道-请分享

这是相当低的技术含量,但是Ctrl-F搜索“This:b+MyClassName”怎么样?

如果您使用的是VS,我猜您是intellisense,它将为您显示给定对象的所有Aviable extensionmethod(在常用的实例方法图标中添加蓝色标记)。该列表可能因文件而异(称为aMethod的方法可能表示两个不同文件中的两个不同内容),即使对象类型相同(这取决于找到扩展方法的方式)

如果您有源代码,则可以使用正则表达式搜索
此类型标识符。考虑到它必须是函数的第一个参数,像这样的东西应该可以做到:

\(this:b+:i:b+:i
至少通过这种方式,您可以发现扩展方法的定义位置并添加名称空间,然后依赖intellisense。只是在一个非平凡的项目上运行了这个,到处都有很多扩展方法,效果不错。唯一的假阳性是这样的:

if(this is Blah...
public
  static ExtensionMethod(
   this int
    iVal) {
}
我们可以通过在搜索中添加
static
来解决这个问题,因为扩展方法必须是静态的:

static.*\(this:b+:i:b+:i
这不适用于以下情况:

if(this is Blah...
public
  static ExtensionMethod(
   this int
    iVal) {
}
但这就是正则表达式的局限性。我相信我可以告诉你所有使用正则表达式解析语言的痛苦


现在,我认为IDE缺少的是识别非导入命名空间中的扩展方法的能力。与您知道类名类似,如果您键入它,IDE将提示您显式使用它或导入命名空间。毕竟,这就是我导入所有名称空间的方式,我经常发现自己也在尝试对扩展方法执行同样的操作。

如果您有resharper,只需按住ctrl键并单击该方法。

不幸的是,这通常不是那么简单。例如,如果您想找到适用于
int[]
数组的所有扩展方法,那么您可能需要搜索
此对象
此T
此T[]
此int[]
此IClonable
此IList
此ICollection
此IEnumerable
此IList
此IList
此ICollection
此ICollection
此IEnumerable
此IEnumerable
。(当然,不能保证扩展方法上的泛型类型参数将实际命名为
T
,而不是
TFoo
TBar
等。)只要您的类文件中包含定义它们的名称空间。@chris满足OP声明的要求:)但是,如果您在不同的名称空间中有同名的方法,并且将这两个名称空间都放在使用列表中,事情就会变得非常有趣。如果你不想改变代码的工作方式,那么就不要对你的使用列表重新排序((我想知道你为什么需要这个?如果扩展方法是按它们应该的方式使用的,并且在正确的命名空间中,如果你应该看到它们,你可以看到它们,如果你不需要它们,你就看不到它们。因为如果扩展方法在不同的项目中,在一个单独的类文件中,命名空间是不够的。而且w/o Re#er,你可以将光标放在他用方法打了F12:)哦,是的:)-忘了那个