Проверки наследования и проверки «совместимости присваивания» на самом деле разные вещи.Вы хотите проверить наследование или «совместимость присваивания»?
Совместимость присваивания включает в себя множество вещей, включая преобразования со знаком / без знака, преобразования перечисления в базовый тип, преобразования char
в short
, общие преобразования отклоненийпреобразования из интерфейсов в object
, из массивов в IList
и IList<T>
и их базовые интерфейсы, ковариацию массивов, универсальный параметр для ограничений и целый ряд других вещей.
Лучше всегопоиск совместимости присвоения и правил «совместимости типов проверки» в спецификации ECMA для получения полного списка.
Я предполагаю, что для ваших конкретных нужд вам понадобится некоторое подмножество полных «проверок совместимости назначений».
К сожалению, у Сесила нет методов, которые бы реализовали это для вас, но он предоставляет достаточно информации, чтобы вы могли реализовать это сами.
Вы должны быть осторожны при реализации чего-то подобного с помощью cecil.В частности, класс TypeReference имеет метод «Resolve», который вам необходимо вызывать в некоторых случаях (для нахождения TypeDefinition для неразрешенной ссылки на тип), но который вы не можете вызвать в других случаях, потому что он будет копать слишком далеко черездерево типов.Вам также придется иметь дело со «структурным равенством типов» для сравнения универсальных экземпляров, и вам придется обрабатывать замену универсальных параметров при переходе по иерархии типов.