На заметку!
Всегда помните о том, что все строки явным образом документируются в метаданных сборки, как продемонстрировано в представленном выше листинге метаданных. Это может привести к крупным последствиям в плане безопасности, если вы применяете строковые литералы для хранения паролей, номеров кредитных карт или другой конфиденциальной информации.У вас может возникнуть вопрос о том, каким образом задействовать такую информацию в разрабатываемых приложениях (в лучшем сценарии) или зачем вообще заботиться о метаданных (в худшем сценарии). Чтобы получить ответ, необходимо ознакомиться со службами рефлексии .NET Core. Следует отметить, что полезность рассматриваемых далее тем может стать ясной только ближе к концу главы, а потому наберитесь терпения.
На заметку!
В разделеMETAINFO вы также найдете несколько маркеров CustomAttribute, которые документируют атрибуты, применяемые внутри кодовой базы. Роль атрибутов .NET Core обсуждается позже в главе.Понятие рефлексии
В мире .NET Core
ildasm.exe, используя дружественную объектную модель. Например, посредством рефлексии можно извлечь список всех типов, содержащихся внутри заданной сборки *.dll или *.ехе, в том числе методы, поля, свойства и события, которые определены конкретным типом. Можно также динамически получать набор интерфейсов, поддерживаемых заданным типом, параметры метода и другие относящиеся к ним детали (базовые классы, пространства имен, данные манифеста и т.д.).Как и любое другое пространство имен, System.Reflection
System.Runtime.dll) содержит набор связанных типов. В табл. 17.1 описаны основные члены System.Reflection, которые необходимо знать.Чтобы понять, каким образом задействовать пространство имен System.Reflection
System.Туре.Класс System.Туре
В классе System.Туре
System.Reflection. Например, метод Туре.GetMethods() возвращает массив объектов MethodInfo, метод Type.GetFields() — массив объектов FieldInfo и т.д. Полный перечень членов, доступных в System.Туре, довольно велик, но в табл. 17.2 приведен список избранных членов, поддерживаемых System.Туре (за исчерпывающими сведениями обращайтесь в документацию по .NET Core).Получение информации о типе с помощью System.Object.GetType()
Экземпляр класса Туре
Туре напрямую, используя ключевое слово new, т.к. Туре является абстрактным классом. Касательно первого способа вспомните, что в классе System.Object определен метод GetType(), который возвращает экземпляр класса Туре, представляющий метаданные текущего объекта:// Получить информацию о типе с применением экземпляра SportsCar.
SportsCar sc = new SportsCar();
Type t = sc.GetType();
Очевидно, что такой подход будет работать, только если подвергаемый рефлексии тип (SportsCar
ildasm.exe не получают информацию о типе, непосредственно вызывая метод System.Object.GetType() для каждого типа — ведь утилита ildasm.exe не компилировалась вместе с вашими специальными сборками.Получение информации о типе с помощью typeof()
Следующий способ получения информации о типе предполагает применение операции typeof
// Получить информацию о типе с использованием операции typeof.
Type t = typeof(SportsCar);
В отличие от метода System.Object.GetType()
typeof удобна тем, что она не требует предварительного создания экземпляра объекта перед получением информации о типе. Однако кодовой базе по-прежнему должно быть известно об исследуемом типе на этапе компиляции, поскольку typeof ожидает получения строго типизированного имени типа.Получение информации о типе с помощью System.Туре.GetType()