Как узнать, какие методы вызывают из метода класса C # - НЕ во время выполнения

У меня есть класс C#, в котором слишком много кода, и я хочу refactor его. То, что я хотел бы сделать, - начать со всех public methods и построить дерево дерево для каждого из них, показывая, какие другие методы в классе вызываются из него, а затем которые вызывают от ребенка один и т. д.

Это позволит мне увидеть, какие private methods принадлежат только одному общедоступному методу , который является общим и так далее.

Обратите внимание, что я НЕ хочу делать это во время выполнения, я хочу, чтобы иметь возможность посмотреть на класс, либо непосредственно в .cs файле , либо используя отражение в скомпилированной библиотеке .

Я знаю, что могу использовать отражение в скомпилированной DLL для получения методов, но я не могу найти способ узнать, какие методы вызывают другие методы в классе.

Какие-нибудь идеи? Опять же, это НЕ проблема времени выполнения, это просто создание многоразовой утилиты, которая поможет реорганизовать негабаритный класс. В решении, над которым я работаю, есть немало, поэтому код снова будет использоваться снова и снова.

5
nl ja de
Oded и unicron - Спасибо за ответы, но я уже знаю об иерархии вызовов. Однако, если я не пропустил что-то, они только позволяют вам видеть методы, вызываемые текущим методом. Затем вам нужно пройти каждый метод и сделать то же самое на каждом из них. Вы также должны отслеживать все это, когда идете вперед. Это становится очень болезненным и подверженным ошибкам очень быстро. Я ищу способ генерации полной иерархии автоматически. Если функция R # или VS может сделать это, тогда, пожалуйста, скажите мне, как, как я не думал, что они могут.
добавлено автор Avrohom Yisroel, источник
Джейсон - спасибо за ссылку, которая выглядит фантастической. Я еще не пробовал, поскольку, похоже, это потребует серьезного изучения, но если это так хорошо, как кажется, оно должно делать именно то, что я хочу. Еще раз спасибо.
добавлено автор Avrohom Yisroel, источник
Если вы хотите сворачивать самостоятельно: stackoverflow.com/a/5741770/16959 , это очень хорошо изученный ответ на Эта тема
добавлено автор Jason Sperske, источник
У Resharper есть это. Это покажет вам все способы использования метода.
добавлено автор Oded, источник
Щелкните правой кнопкой мыши метод -> «Просмотреть иерархию вызовов»?
добавлено автор Brendan Hannemann, источник

1 ответы

Visual Studio 2010 имеет действие «Просмотр иерархии вызовов», где вы можете увидеть все места в своем решении, где вызывается код.

По моему опыту этот статический анализ может быть несколько недостаточным, например, метод можно назвать динамически, используя Reflection, посредством привязки данных, через контейнер для инъекций зависимостей и т. Д.

Кроме того, это может быть отключено от темы и не применимо в вашем случае, но я считаю, что хороший способ найти мертвый код для компонента - это набор тестов интеграции. Затем вы можете запустить покрытие кода и визуально увидеть, какие пути кода никогда не выполняются.

10
добавлено
Себастьян - спасибо за ответ, но если вы прочтете мой ответ Одеду и униконру выше, вы поймете, почему эта функция недостаточно мощна для того, что мне нужно. Тестирование - интересный подход, но сейчас будет слишком много работы над существующим (и очень большим) классом и слишком сложно проанализировать, чтобы узнать, что называется.
добавлено автор Avrohom Yisroel, источник
Себастьян - Спасибо за подсказку, но это пока только показывает один уровень за раз. Создание картины полного дерева все равно займет много времени и будет болезненно медленным, не говоря уже о склонности к ошибкам. У меня есть VS2010 Pro, но не могу увидеть параметр «Анализ кода», когда я нажимаю правой кнопкой мыши проект. Вы знаете, как это сделать, или это не в моей версии VS? (отредактируйте ...) Ах, только что обнаружил, что это только в премиум-классе. Позор, спасибо в любом случае
добавлено автор Avrohom Yisroel, источник
Привет снова Себастьян. У меня есть R #, и я использую все время. Проблемы с кодом - хорошая функция, но здесь я ищу гораздо больше, чем просто неиспользуемый код, мне нужно увидеть фактическое использование всех методов. На данный момент похоже, что мне придется написать свой собственный код для разбора класса :( Спасибо в любом случае
добавлено автор Avrohom Yisroel, источник
Здравствуйте. Спасибо за эту ссылку, там есть интересные идеи. Я закончил тем, что написал свой собственный код для анализа файла .cs и определения того, какие методы вызывают. Не идеально, но работает очень хорошо. Тем не менее, есть некоторые идеи, которые я хотел бы исследовать, поскольку они могли бы продвигаться, чтобы быть еще лучше. Еще раз спасибо.
добавлено автор Avrohom Yisroel, источник
+1 для комментария к отражению, DI и т. Д.
добавлено автор Brian Knight, источник
Просмотр иерархии вызовов на самом деле показывает вам вид двойного дерева - или дерева и корней :) Таким образом, вы можете видеть все методы, вызывающие данный метод, а также все методы, называемые данным методом.
добавлено автор Sebastian K, источник
Также может быть полезен «Анализ кода», если он доступен в вашем издании студии VS, хотя он может не дать вам все, что вы ищете. Здесь описано: stackoverflow.com/questions/2020297/…
добавлено автор Sebastian K, источник
Да, мне жаль, что это было бы легче. Если у вас есть ReSharper (или вы хотите получить пробную версию). Вы также можете попытаться запустить «Найти проблемы с кодом» в своем решении, а затем искать проблемы «Неиспользуемые ...». Однако, как отмечали люди, он будет сообщать, что элементы используются, даже если они просто используются в тестах или зарегистрированы в контейнере DI. stackoverflow.com/questions/245963/find-unused-code
добавлено автор Sebastian K, источник
@AvrohomYisroel: Если вы все еще работаете над этим, я недавно наткнулся на добавлено автор Sebastian K, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot