Leggi in inglese

Condividi tramite


MethodBody Classe

Definizione

Fornisce l'accesso ai metadati e al linguaggio MSIL (Microsoft Intermediate Language) relativi al corpo di un metodo.

C#
public class MethodBody
C#
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class MethodBody
C#
[System.Runtime.InteropServices.ComVisible(true)]
public class MethodBody
Ereditarietà
MethodBody
Attributi

Esempio

L'esempio di codice seguente definisce un metodo di test denominato MethodBodyExample e visualizza le relative informazioni sulle variabili locali e le clausole di gestione delle eccezioni. Il MethodBase.GetMethodBody metodo viene usato per ottenere un MethodBody oggetto per il metodo di test.

Nell'esempio viene usata la proprietà per ottenere un elenco di oggetti e quindi vengono visualizzati i tipi e l'ordine LocalVariables di LocalVariableInfo indice. La ExceptionHandlingClauses proprietà viene usata per ottenere un elenco di clausole di gestione delle eccezioni.

C#
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

Commenti

La MethodBody classe fornisce l'accesso alle informazioni sulle variabili locali e sulle clausole di gestione delle eccezioni in un corpo del metodo e al linguaggio intermedio Microsoft (MSIL) che costituisce il corpo del metodo.

È possibile usare i metodi di risoluzione dei token della classe modulo, ad esempio ResolveType, ResolveMethode ResolveType, per risolvere i token nel corpo del metodo a Type oggetti, oggetti e oggetti che forniscono informazioni dettagliate sui tipi, MethodInfo i metodi e FieldInfo i campi a cui accede il metodo MSIL nel corpo del metodo.

Nota

I corpi dei metodi di analisi richiedono una conoscenza approfondita dei metadati e dei formati di istruzione MSIL. Le informazioni sono disponibili nella documentazione di Common Language Infrastructure (CLI), in particolare "Partition II: Metadata Definition and Semantics".

Per ottenere un oggetto per un determinato metodo, ottenere prima un MethodInfoMethodBody oggetto per il metodo, quindi chiamare il MethodInfo metodo dell'oggettoGetMethodBody.

Costruttori

MethodBody()

Inizializza una nuova istanza della classe MethodBody.

Proprietà

ExceptionHandlingClauses

Ottiene un elenco che include tutte le clausole di gestione delle eccezioni nel corpo del metodo.

InitLocals

Ottiene un valore che indica se le variabili locali nel corpo del metodo sono inizializzate sui valori predefiniti dei tipi corrispondenti.

LocalSignatureMetadataToken

Ottiene un token di metadati per la firma che descrive le variabili locali per il metodo nei metadati.

LocalVariables

Ottiene l'elenco delle variabili locali dichiarate nel corpo del metodo.

MaxStackSize

Ottiene il numero massimo di elementi nello stack di operandi durante l'esecuzione del metodo.

Metodi

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetILAsByteArray()

Restituisce il codice MSIL per il corpo del metodo come matrice di byte.

GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1