Определите Ассоциации Классов, используя Отражение

Я работаю над решением, которое извлекает все классовые ассоциации между собой. Если щелкнуть класс в браузере объектов, мы увидим опцию Find All References, Я хочу что-то подобное, чтобы найти ассоциации, класс имеет с другими классами. Как мы можем найти их, используя Reflection?

Я заинтересован в извлечении

  1. Композиция Отношения:
  2. Агрегация Отношения
  3. Ассоциация Отношения
  4. наследование

2 ответа

Решение

Ты можешь использовать Reflection для того, чтобы перечислить все свойства, поля и методы (и более) класса. Вам придется проверить их и определить их типы и списки параметров. Вероятно, было бы неплохо отказаться от типов из System Пространство имен.

Type t = typeof(MyClass);

// Determine from which type a class inherits
Type baseType = t.BaseType;

// Determine which interfaces a class implements
Type[] interfaces = t.GetInterfaces();

// Get fields, properties and methods
const BindingFlags bindingFlags =
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo[] fields = t.GetFields(bindingFlags);
PropertyInfo[] properties = t.GetProperties(bindingFlags);
MethodInfo[] methods = t.GetMethods(bindingFlags);

foreach (var method in methods) {
    // Get method parameters
    ParameterInfo[] parameters = method.GetParameters();
}

Intellisense расскажет вам (почти) все секреты FieldInfo, PropertyInfo, MethodInfo а также ParameterInfo, Вы также можете рассмотреть общие параметры класса, события и многое другое.

Вам нужно будет проанализировать сгенерированный код IL, желательно с пониманием того, как они работают. Вы можете получить код IL, вызвав MethodBase.GetMethodBody, а затем MethodBody.GetILAsByteArray.

Вам нужно проанализировать каждый байт в соответствии с перечислением OpCodes. Вам также нужно будет обрабатывать все данные кода операции, такие как смещения и токены, так как вы не должны анализировать их как фактические коды операций. Взять, к примеру, код операции OpCodes.Ldstr; он состоит из 0x72, за которым следует токен. Этот токен составляет четыре байта, которые должны быть проанализированы как Int32, и может быть разрешен с помощью Module.ResolveString (так как вы знаете, что ldstr имеет строковый токен). Вы можете получить экземпляр модуля из Assembly.AssemblyManifestModule.

Другие вопросы по тегам