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


Класс System.Reflection.Emit.MethodBuilder

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

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

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

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

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

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

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

Методы как элементы типов

Метод определяется как член типа с помощью 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.
  • Поддерживаются пользовательские модификаторы.