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