Прочитать на английском

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


MethodBody Класс

Определение

Предоставляет доступ к метаданным и MSIL для тела метода.

public class MethodBody
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class MethodBody
[System.Runtime.InteropServices.ComVisible(true)]
public class MethodBody
Наследование
MethodBody
Атрибуты

Примеры

В следующем примере кода определяется метод теста с именем MethodBodyExample и отображаются сведения о локальной переменной и предложения обработки исключений. Метод MethodBase.GetMethodBody используется для получения MethodBody объекта для метода теста.

В примере свойство используется для LocalVariables получения списка LocalVariableInfo объектов , а затем отображаются их типы и порядок индексов. Свойство ExceptionHandlingClauses используется для получения списка предложений обработки исключений.

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        // Get method body information.
        MethodInfo mi = typeof(Example).GetMethod("MethodBodyExample");
        MethodBody mb = mi.GetMethodBody();
        Console.WriteLine("\r\nMethod: {0}", mi);

        // Display the general information included in the
        // MethodBody object.
        Console.WriteLine("    Local variables are initialized: {0}",
            mb.InitLocals);
        Console.WriteLine("    Maximum number of items on the operand stack: {0}",
            mb.MaxStackSize);

        // Display information about the local variables in the
        // method body.
        Console.WriteLine();
        foreach (LocalVariableInfo lvi in mb.LocalVariables)
        {
            Console.WriteLine("Local variable: {0}", lvi);
        }

        // Display exception handling clauses.
        Console.WriteLine();
        foreach (ExceptionHandlingClause ehc in mb.ExceptionHandlingClauses)
        {
            Console.WriteLine(ehc.Flags.ToString());

            // The FilterOffset property is meaningful only for Filter
            // clauses. The CatchType property is not meaningful for
            // Filter or Finally clauses.
            switch (ehc.Flags)
            {
                case ExceptionHandlingClauseOptions.Filter:
                    Console.WriteLine("        Filter Offset: {0}",
                        ehc.FilterOffset);
                    break;
                case ExceptionHandlingClauseOptions.Finally:
                    break;
                default:
                    Console.WriteLine("    Type of exception: {0}",
                        ehc.CatchType);
                    break;
            }

            Console.WriteLine("       Handler Length: {0}", ehc.HandlerLength);
            Console.WriteLine("       Handler Offset: {0}", ehc.HandlerOffset);
            Console.WriteLine("     Try Block Length: {0}", ehc.TryLength);
            Console.WriteLine("     Try Block Offset: {0}", ehc.TryOffset);
        }
    }

    // The Main method contains code to analyze this method, using
    // the properties and methods of the MethodBody class.
    public void MethodBodyExample(object arg)
    {
        // Define some local variables. In addition to these variables,
        // the local variable list includes the variables scoped to
        // the catch clauses.
        int var1 = 42;
        string var2 = "Forty-two";

        try
        {
            // Depending on the input value, throw an ArgumentException or
            // an ArgumentNullException to test the Catch clauses.
            if (arg == null)
            {
                throw new ArgumentNullException("The argument cannot be null.");
            }
            if (arg.GetType() == typeof(string))
            {
                throw new ArgumentException("The argument cannot be a string.");
            }
        }

        // This filter clause selects only exceptions that derive
        // from the ArgumentException class.
        // Other exceptions, including ArgumentException itself,
        // are not handled by this filter clause.
        catch (ArgumentException ex) when (ex.GetType().IsSubclassOf(typeof(ArgumentException)))
        {
            Console.WriteLine("Filter clause caught: {0}", ex.GetType());
        }

        // This catch clause handles the ArgumentException class, and
        // any other class derived from Exception.
        catch(Exception ex)
        {
            Console.WriteLine("Ordinary exception-handling clause caught: {0}",
                ex.GetType());
        }
        finally
        {
            var1 = 3033;
            var2 = "Another string.";
        }
    }
}

// This code example produces output similar to the following:
//
//Method: Void MethodBodyExample(System.Object)
//    Local variables are initialized: True
//    Maximum number of items on the operand stack: 2
//
//Local variable: System.Int32 (0)
//Local variable: System.String (1)
//Local variable: System.Exception (2)
//Local variable: System.Boolean (3)
//
//Filter
//      Filter Offset: 71
//      Handler Length: 23
//      Handler Offset: 116
//      Try Block Length: 61
//      Try Block Offset: 10
//Clause
//    Type of exception: System.Exception
//       Handler Length: 21
//       Handler Offset: 70
//     Try Block Length: 61
//     Try Block Offset: 9
//Finally
//       Handler Length: 14
//       Handler Offset: 94
//     Try Block Length: 85
//     Try Block Offset: 9

Комментарии

Класс MethodBody предоставляет доступ к сведениям о локальных переменных и предложениях обработки исключений в теле метода, а также к промежуточному языку Майкрософт (MSIL), который составляет тело метода.

Можно использовать методы разрешения маркеров класса модуля, такие как ResolveType, ResolveMethodи ResolveType, для разрешения маркеров в теле Type метода в объекты, MethodInfo объекты и FieldInfo объекты, предоставляющие подробные сведения о типах, методах и полях, к которым обращается MSIL в теле метода.

Примечание

Для анализа текста метода требуется тщательное понимание метаданных и форматов инструкций MSIL. Сведения можно найти в документации по общеязыковой инфраструктуре (CLI), в частности в разделе "Раздел II: определение и семантика метаданных".

Чтобы получить MethodBody объект для заданного метода, сначала получите MethodInfo объект для метода , а затем вызовите MethodInfo метод объекта GetMethodBody .

Конструкторы

MethodBody()

Инициализирует новый экземпляр класса MethodBody.

Свойства

ExceptionHandlingClauses

Возвращает список, содержащий все предложения обработки исключений в теле метода.

InitLocals

Возвращает значение, которое определяет, будут ли локальные переменные в теле метода инициализированы значениями по умолчанию, предусмотренными для соответствующих типов.

LocalSignatureMetadataToken

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

LocalVariables

Возвращает список локальных переменных, объявленных в теле метода.

MaxStackSize

Возвращает максимальное количество элементов в стеке операторов при выполнении метода.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetILAsByteArray()

Возвращает код MSIL тела метода в виде массива байтов.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к