Поделиться через


Системы. Рефлексия ion. Класс Emit.MethodBuilder

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Класс MethodBuilder используется для полного описания метода в общем промежуточном языке (CIL), включая имя, атрибуты, сигнатуру и текст метода. Он используется в сочетании с классом TypeBuilder для создания классов во время выполнения.

Вы можете использовать отражение для определения глобальных методов и определения методов в качестве элементов типа. API, определяющие возвращаемые методы MethodBuilder .

Глобальные методы

Глобальный метод определяется с помощью ModuleBuilder.DefineGlobalMethod метода, который возвращает MethodBuilder объект.

Глобальные методы должны быть статическими. Если динамический модуль содержит глобальные методы, ModuleBuilder.CreateGlobalFunctions метод необходимо вызвать перед сохранением динамического модуля или содержащей динамической сборки, так как среда CLR откладывает исправление динамического модуля до тех пор, пока не будут определены все глобальные функции.

Глобальный собственный метод определяется с помощью ModuleBuilder.DefinePInvokeMethod метода. Методы вызова платформы (PInvoke) не должны объявляться абстрактными или виртуальными. Среда выполнения задает MethodAttributes.PinvokeImpl атрибут для метода вызова платформы.

Методы в качестве членов типов

Метод определяется как член типа с помощью TypeBuilder.DefineMethod метода, который возвращает MethodBuilder объект.

Метод DefineParameter используется для задания атрибутов имени и параметров параметра или возвращаемого значения. Объект, ParameterBuilder возвращаемый этим методом, представляет параметр или возвращаемое значение. Объект ParameterBuilder можно использовать для задания маршалинга, задания константного значения и применения пользовательских атрибутов.

Атрибуты

MethodAttributes Члены перечисления определяют точный символ динамического метода:

  • Статические методы задаются с помощью атрибута MethodAttributes.Static .
  • Конечные методы (методы, которые не могут быть переопределены) задаются с помощью атрибута MethodAttributes.Final .
  • Виртуальные методы задаются с помощью атрибута MethodAttributes.Virtual .
  • Абстрактные методы задаются с помощью атрибута MethodAttributes.Abstract .
  • Несколько атрибутов определяют видимость метода. См. описание перечисления MethodAttributes .
  • Методы, реализующие перегруженные операторы, должны задать MethodAttributes.SpecialName атрибут.
  • Методы завершения должны задать MethodAttributes.SpecialName атрибут.

Известные проблемы

  • Несмотря MethodBuilder на то MethodInfo, что некоторые абстрактные методы, определенные в MethodInfo классе, не полностью реализованы MethodBuilder. Эти MethodBuilder методы вызывают NotSupportedExceptionисключение . Например, MethodBuilder.Invoke метод не полностью реализован. Эти методы можно отразить, извлекая вложенный тип с помощью Type.GetType или Assembly.GetType методов.
  • Поддерживаются пользовательские модификаторы.