Dela via


Reflektion i .NET

Med klasserna i System.Reflection namnområdet, tillsammans med System.Type, kan du hämta information om inlästa sammansättningar och de typer som definierats i dem, till exempel klasser, gränssnitt och värdetyper (d.ex. strukturer och uppräkningar). Du kan också använda reflektion för att skapa typinstanser vid körning och för att anropa och komma åt dem.

Sammansättningar innehåller moduler, moduler innehåller typer och typer innehåller medlemmar. Reflektion innehåller objekt som kapslar in sammansättningar, moduler och typer. Du kan använda reflektion för att dynamiskt skapa en instans av en typ, binda typen till ett befintligt objekt eller hämta typen från ett befintligt objekt. Du kan sedan anropa typens metoder eller komma åt dess fält och egenskaper. Typiska användningar av reflektion är följande:

  • Använd Assembly för att definiera och läsa in sammansättningar, läsa in moduler som anges i sammansättningsmanifestet och leta upp en typ från den här sammansättningen och skapa en instans av den.
  • Använd Module för att identifiera information, till exempel sammansättningen som innehåller modulen och klasserna i modulen. Du kan också få alla globala metoder eller andra specifika, icke-globala metoder definierade i modulen.
  • Använd ConstructorInfo för att identifiera information som namn, parametrar, åtkomstmodifierare (till exempel public eller private) och implementeringsinformation (till exempel abstract eller virtual) för en konstruktor. GetConstructors Använd metoden eller GetConstructor för en Type för att anropa en specifik konstruktor.
  • Använd MethodInfo för att identifiera information som namn, returtyp, parametrar, åtkomstmodifierare och implementeringsinformation (till exempel abstract eller virtual) för en metod. GetMethods Använd metoden eller GetMethod för en Type för att anropa en specifik metod.
  • Använd FieldInfo för att identifiera information som namn, åtkomstmodifierare och implementeringsinformation (till exempel static) för ett fält och för att hämta eller ange fältvärden.
  • Använd EventInfo för att identifiera information som namn, händelsehanterardatatyp, anpassade attribut, deklareringstyp och reflekterad typ av en händelse samt för att lägga till eller ta bort händelsehanterare.
  • Använd PropertyInfo för att identifiera information som namn, datatyp, deklareringstyp, reflekterad typ och skrivskyddad eller skrivbar status för en egenskap och för att hämta eller ange egenskapsvärden.
  • Använd ParameterInfo för att identifiera information som en parameters namn, datatyp, om en parameter är en indata- eller utdataparameter och parameterns position i en metodsignatur.
  • Använd CustomAttributeData för att identifiera information om anpassade attribut när du arbetar i kontexten MetadataLoadContext eller endast reflektion (.NET Framework). CustomAttributeData gör att du kan undersöka attribut utan att skapa instanser av dem.

Klasserna i System.Reflection.Emit namnområdet ger en specialiserad form av reflektion som gör att du kan skapa typer vid körning.

Reflektion kan också användas för att skapa typwebbläsare, vilket gör det möjligt för användare att välja typer och sedan visa information om dessa typer.

Det finns andra användningsområden för reflektion. Kompilatorer för språk som JScript använder reflektion för att konstruera symboltabeller. Klasserna i System.Runtime.Serialization namnområdet använder reflektion för att komma åt data och för att avgöra vilka fält som ska sparas. Klasserna i System.Runtime.Remoting namnområdet använder reflektion indirekt genom serialisering.

Körningstyper i reflektion

Reflektion ger klasser, till exempel Type och MethodInfo, för att representera typer, medlemmar, parametrar och andra kodentiteter. Men när du använder reflektion arbetar du inte direkt med dessa klasser, varav de flesta är abstrakta (MustInherit i Visual Basic). I stället arbetar du med typer som tillhandahålls av CLR (Common Language Runtime).

När du till exempel använder C# typeof -operatorn (GetType i Visual Basic) för att hämta ett Type objekt är objektet verkligen en RuntimeType. RuntimeType härleds från Type och tillhandahåller implementeringar av alla abstrakta metoder.

Dessa körningsklasser är internal (Friend i Visual Basic). De dokumenteras inte separat från sina basklasser eftersom deras beteende beskrivs i basklassdokumentationen.

Referens