Programmering

Hvordan jobbe med refleksjon i C #

Refleksjon i C # brukes til å hente metadata på typer ved kjøretid. Med andre ord, du kan bruke refleksjon til å inspisere metadata av typene i programmet ditt dynamisk - du kan hente informasjon om de lastede samlingene og typene som er definert i dem. Refleksjon i C # ligner på RTTI (Runtime Type Information) av C ++.

For å jobbe med refleksjon i .Net, bør du inkludere System.Reflection-navneområdet i programmet ditt. Ved bruk av refleksjon får du objekter av typen "Type" som kan brukes til å representere samlinger, typer eller moduler. Du kan bruke refleksjon til å lage en forekomst av en type dynamisk og til og med påkalle metoder av typen.

Typene som er definert i System.Reflection-navneområdet inkluderer følgende.

  • montering
  • Modul
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Type
  • FieldInfo
  • EventInfo
  • PropertyInfo

La oss nå grave i litt kode for å sette refleksjon i handling. Tenk på følgende klasse som heter Kunde.

offentlig klasse kunde

    {

offentlig int Id

        {

få; sett;

        }

offentlig streng Fornavn

        {

få; sett;

        }

offentlig streng Etternavn

        {

få; sett;

        }

offentlig streng Adresse

        {

få; sett;

        }

    }

Følgende kodebit viser hvordan du kan få klassenavnet og navneplassenavnet til klassen ved hjelp av refleksjon:

Type type = typeof (kunde);

Console.WriteLine ("Klasse:" + type.Name);

Console.WriteLine ("Navneområde:" + type.Namespace);

Følgende kodebit illustrerer hvordan du kan hente listen over egenskapene til kundeklassen og vise navnene i konsollvinduet:

statisk tomrom Main (streng [] args)

        {

Type type = typeof (kunde);

PropertyInfo [] propertyInfo = type.GetProperties ();

Console.WriteLine ("Listen over egenskaper i kundeklassen er: -");

foreach (PropertyInfo pInfo i propertyInfo)

            {

Console.WriteLine (pInfo.Name);

            }

        }

GetProperties () -metoden i Type-klassen returnerer en matrise av typen PropertyInfo - dette er faktisk en liste over de offentlige egenskapene av din type. Du kan deretter gjenta denne matrisen og hente navnene på hver av de offentlige egenskapene som er definert i din type. Siden kundeklassen definerer tre egenskaper, vil navnene på alle disse tre egenskapene vises i konsollen når dette programmet kjøres.

Slik kan vi vise metadataene til konstruktørene og offentlige metoder av en type ved hjelp av refleksjon. La oss se på kundeklassen vi opprettet tidligere, og innlemme to metoder - en standardkonstruktør og en metode som heter Valider, som brukes til å validere kundeobjektet som sendes til den som en parameter. Slik ser den modifiserte versjonen av kundeklassen ut.

offentlig klasse kunde

    {

offentlig kunde ()

        {

// Standardkonstruktør

        }

offentlig int Id

        {

få; sett;

        }

offentlig streng Fornavn

        {

få; sett;

        }

offentlig streng Etternavn

        {

få; sett;

        }

offentlig streng Adresse

        {

få; sett;

        }

public bool Validate (Customer customerObj)

        {

// Kode for å validere kundeobjektet

returner sant;

        }

    }

Følgende kodebit kan brukes til å vise navnene på alle konstruktørene som tilhører kundeklassen. Vi har bare en konstruktør i kundeklassen - derfor vil bare en bli oppført.

Type type = typeof (kunde);

ConstructorInfo [] constructorInfo = type.GetConstructors ();

Console.WriteLine ("Kundeklassen inneholder følgende konstruktører: -");

foreach (ConstructorInfo c i constructorInfo)

  {

Console.WriteLine (c);

  }

Merk at GetConstructors () -metoden i Type-klassen returnerer en matrise av typen ConstructorInfo som inneholder listen over alle de offentlige konstruktørene som er definert i typen som reflekteres.

OK; la oss nå vise navnene på alle de offentlige metodene i kundeklassen - igjen, vi har bare en slik at navnet på bare en metode vil bli vist i konsollen når det neste programmet blir utført. Her er kodelisten for din referanse.

statisk tomrom Main (streng [] args)

 {

Type type = typeof (kunde);

MethodInfo [] methodInfo = type.GetMethods ();

  Console.WriteLine ("Metodene i kundeklassen er: -");

foreach (MethodInfo temp i methodInfo)

            {

Console.WriteLine (temp.Name);

            }

Console.Read ();

        }

Merk at du kan få navnene på noen få andre metoder (ToString, Equals, GetHashCode, GetType) også vist. Disse metodene arves fra Object-klassen - hvilken som helst klasse i .Net henter Object-klassen som standard.

Du kan også gjenta gjennom attributtene til en metode. Hvis egendefinerte attributter er definert for metodene dine, kan du bruke GetCustomAttributes-metoden i forekomsten av MethodInfo-klassen for å hente attributtene til metoden. Slik kan du oppnå dette.

foreach (MethodInfo temp i methodInfo)

 {

foreach (Attributtattributt i temp.GetCustomAttributes (true))

     {

// Skriv din vanlige kode her

     }

  }

Så hvis du dekorerer forretningsobjektene dine ved hjelp av attributter i applikasjonen din, kan du dra nytte av refleksjon for å reflektere over typen, hente attributtene til metodene av din type og deretter utføre noen handlinger i samsvar med dette.

$config[zx-auto] not found$config[zx-overlay] not found