如何在解决方案中找到所有扩展方法?

时间:2009-05-13 11:43:45

标签: c# visual-studio-2008 extension-methods

如何在解决方案中找到所有扩展方法?

5 个答案:

答案 0 :(得分:7)

如果我这样做,我会搜索所有文件中的字符串“(这个” - 您的搜索字符串可能因格式选项而异。

编辑:经过一些实验,使用“在文件中查找”(Ctrl-Shift-F),以下内容似乎对我有高精度的作用

  • 搜索字符串:“\( this [A-Za-z]”(当然减去引号)
  • 匹配案例:未选中
  • 匹配整个单词:未选中
  • 使用:正则表达式
  • 查看以下文件类型:“* .cs”

答案 1 :(得分:6)

我会使用反射查看生成的程序集;迭代查找具有[ExtensionAttribute] ...

方法的静态类型
static void ShowExtensionMethods(Assembly assembly)
{
    foreach (Type type in assembly.GetTypes())
    {
        if (type.IsClass && !type.IsGenericTypeDefinition
            && type.BaseType == typeof(object)
            && type.GetConstructors().Length == 0)
        {
            foreach (MethodInfo method in type.GetMethods(
                BindingFlags.Static |
                BindingFlags.Public | BindingFlags.NonPublic))
            {
                ParameterInfo[] args;

                if ((args = method.GetParameters()).Length > 0 &&
                    HasAttribute(method,
                      "System.Runtime.CompilerServices.ExtensionAttribute"))
                {
                    Console.WriteLine(type.FullName + "." + method.Name);
                    Console.WriteLine("\tthis " + args[0].ParameterType.Name
                        + " " + args[0].Name);
                    for (int i = 1; i < args.Length; i++)
                    {
                        Console.WriteLine("\t" + args[i].ParameterType.Name
                            + " " + args[i].Name);
                    }
                }
            }
        }
    }
}
static bool HasAttribute(MethodInfo method, string fullName)
{
    foreach(Attribute attrib in method.GetCustomAttributes(false))
    {
        if (attrib.GetType().FullName == fullName) return true;
    }
    return false;
}

答案 2 :(得分:2)

也许可以使用本文中有关how to find extension methods targeting object的代码?例如,可以稍微重写并使用它来转储所有扩展方法,而不仅仅是那些定位object的扩展方法。

答案 3 :(得分:1)

您是否只想查看源代码(只查找文件中的(this ...)或通过反射查看正在运行的程序(在这种情况下,此this讨论可以帮助您)?

答案 4 :(得分:1)

解决方案宽文本搜索与正则表达式匹配您的编码风格。像"( *this +"之类的东西(添加了第一个可选空格以获得一些错误容忍)。