Отражение.NET: Find использовал типы

Я вытягивал волосы, пытаясь решить это. То, что я пытаюсь сделать, должно создать 'карту' того, как объекты используются в небольшом количестве кода, я продолжаю работать. Думайте о нем как о расширенной Находке Использования. Самый легкий способ показать это примером:

public class MasterClass
{
    Type1 type1;
    Type2 type2;
    Type3 type3;
    void InitializeData()
    {
        type1 = new Type1(this);
        type2 = new Type2(this);
        type3 = new Type3(this);
    }
}

public class Type1
{
    private MasterClass _master;
    public Type1(MasterClass master)
    {
        _master = master;
    }
    public void Something()
    {
        //use _master.type2 and _master.type3 here
    }
}

public class Type2
{
    private MasterClass _master;
    public Type2(MasterClass master)
    {
        _master = master;
    }
    public void Something()
    {
        //use _master.type3 here
    }
}

public class Type3
{
    private MasterClass _master;
    public Type3(MasterClass master)
    {
        _master = master;
    }
    public void Something()
    {
        //use _master.type1 and _master.type2 here
    }
}

То, что я пытаюсь сделать, получают отображение или сообщают, что, в случае примера, дал бы что-то как:

Type1, используемый: {Type3}

Type2, используемый: {Type1, Type3}

Type3, используемый: {Type1, Type2}

Если я могу получить его в словарь затем, я дома.:-)

Что я попробовал:

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

Я могу использовать Отражатель && / || Resharper для получения единственной ссылки за один раз, но я хотел бы получить их внезапно.

Какие-либо предложения?

5
задан John Saunders 29 December 2009 в 18:31
поделиться

4 ответа

Это нелегко. Вам нужно будет получить экземпляр MethodInfo, PropertyInfo, FieldInfo и т.д. для всех следующих:

  • методов
  • types
  • properties (get and set)
  • event (add and remove)

Затем вам нужно будет разобрать IL и вызвать экземпляр ResolveMethod на экземпляре Module, в котором находится исследуемый тип, и посмотреть, соответствует ли этот экземпляр событию МетодInfo для вашего метода, который вы пытаетесь определить использование.

EDIT:

Как и "Найти все ссылки" в Visual Studio, в нем будут найдены только прямые прямые ссылки. Если вы также хотите найти косвенные ссылки (ex: method1 references method2, и method2 references method3 - вы хотите увидеть, что есть связь между method1 и method3), то это нужно сделать с помощью рекурсии.

.
3
ответ дан 13 December 2019 в 22:09
поделиться

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

7
ответ дан 13 December 2019 в 22:09
поделиться

Если вы просто ищете инструмент, то рефлектор может сделать это с помощью некоторых дополнений.

Здесь вы найдете широкий спектр дополнений: http://reflectoraddins.codeplex.com/

Некоторые плагины типа FileGenerator могут копировать вывод рефлектора непосредственно в файл.

0
ответ дан 13 December 2019 в 22:09
поделиться
[

] Попробуйте [] Jb Evain[] [] CILReader[] или [] Cecil[][

]. [

] Он упоминает хорошее решение проблемы симиляра [] здесь [] [

].
0
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: