Как я могу найти все методы расширения в решении? - PullRequest
9 голосов
/ 13 мая 2009

Как мне найти все методы расширения в решении?

Ответы [ 5 ]

7 голосов
/ 13 мая 2009

Если бы я делал это, я бы искал во всех файлах строку "(this" - ваша строка поиска может отличаться в зависимости от параметров форматирования.

РЕДАКТИРОВАТЬ : После небольшого количества экспериментов мне кажется, что следующее с высокой точностью работает для меня с использованием "Поиск в файлах" (Ctrl-Shift-F)

  • Строка поиска: "\( this [A-Za-z]" (конечно, без кавычек)
  • Случай совпадения: не отмечен
  • Совпадение всего слова: не проверено
  • Использование: регулярные выражения
  • Посмотрите на следующие типы файлов: "* .cs"
6 голосов
/ 13 мая 2009

Я бы посмотрел на сгенерированные сборки, используя отражение; перебирайте статические типы в поисках методов с [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 голосов
/ 13 мая 2009

Может быть, код в этой статье о , как найти методы расширения для объекта , может быть использован? Например, можно немного переписать и использовать его для вывода всех методов расширения, а не только тех, которые нацелены на object.

1 голос
/ 13 мая 2009

Решение для широкого текстового поиска с регулярным выражением, соответствующим вашему стилю кодирования. Что-то вроде "( *this +" (добавлен первый необязательный пробел, чтобы получить допуск на ошибку).

1 голос
/ 13 мая 2009

Вы просто хотите проверить исходный код (просто найдите (this ... в файлах) или работающую программу по рефлексии (в данном случае это это обсуждение может вам помочь)?

...