Programmering

Sådan arbejder du med refleksion i C #

Refleksion i C # bruges til at hente metadata om typer ved runtime. Med andre ord kan du bruge refleksion til at inspicere metadata af typerne i dit program dynamisk - du kan hente oplysninger om de indlæste samlinger og de typer, der er defineret i dem. Refleksion i C # svarer til RTTI (Runtime Type Information) for C ++.

For at arbejde med refleksion i .Net skal du medtage System.Reflection-navneområdet i dit program. Ved brug af refleksion får du objekter af typen "Type", der kan bruges til at repræsentere samlinger, typer eller moduler. Du kan bruge refleksion til at oprette en forekomst af en type dynamisk og endda påberåbe sig metoder af typen.

De typer, der er defineret i System.Reflection-navneområdet, inkluderer følgende.

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

Lad os nu grave i noget kode for at sætte refleksion i handling. Overvej følgende klasse kaldet kunde.

offentlig klasse kunde

    {

offentlig int Id

        {

få; sæt;

        }

offentlig streng Fornavn

        {

få; sæt;

        }

offentlig streng Efternavn

        {

få; sæt;

        }

public string Adresse

        {

få; sæt;

        }

    }

Følgende kodestykke viser, hvordan du kan få klassens navn og navneområdet for kundeklassen ved hjælp af refleksion:

Type type = type af (kunde);

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

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

Følgende kodestykke illustrerer, hvordan du kan hente listen over egenskaberne i kundeklassen og vise deres navne i konsolvinduet:

statisk ugyldigt Main (streng [] args)

        {

Type type = type af (kunde);

PropertyInfo [] propertyInfo = type.GetProperties ();

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

foreach (PropertyInfo pInfo i propertyInfo)

            {

Console.WriteLine (pInfo.Name);

            }

        }

Metoden GetProperties () i klassen Type returnerer en matrix af typen PropertyInfo - dette er faktisk en liste over de offentlige egenskaber af din type. Du kan derefter gentage dette array og hente navnene på hver af de offentlige egenskaber, der er defineret i din type. Da kundeklassen definerer tre egenskaber, vises navnene på alle disse tre egenskaber i konsollen, når dette program udføres.

Her er hvordan vi kan vise metadata for konstruktører og offentlige metoder af en type ved hjælp af refleksion. Lad os se igen på kundeklassen, vi oprettede tidligere, og inkorporere to metoder - en standardkonstruktør og en metode kaldet Validate, der bruges til at validere kundeobjektet, der sendes til det som en parameter. Sådan ser den ændrede version af kundeklassen ud.

offentlig klasse kunde

    {

offentlig kunde ()

        {

// Standardkonstruktør

        }

offentlig int Id

        {

få; sæt;

        }

offentlig streng Fornavn

        {

få; sæt;

        }

offentlig streng Efternavn

        {

få; sæt;

        }

public string Adresse

        {

få; sæt;

        }

public bool Validate (KundekundeObj)

        {

// Kode til validering af kundeobjektet

returner sandt;

        }

    }

Følgende kodestykke kan bruges til at vise navnene på alle konstruktører, der hører til kundeklassen. Vi har kun en konstruktør i kundeklassen - derfor vil kun en blive opført.

Type type = typeof (kunde);

ConstructorInfo [] constructorInfo = type.GetConstructors ();

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

foreach (ConstructorInfo c i constructorInfo)

  {

Console.WriteLine (c);

  }

Bemærk, at GetConstructors () -metoden i Type-klassen returnerer en matrix af typen ConstructorInfo, der indeholder listen over alle de offentlige konstruktører, der er defineret i den type, der reflekteres.

OKAY; lad os nu vise navnene på alle de offentlige metoder i kundeklassen - igen, vi har bare en, så navnet på kun en metode vil blive vist i konsollen, når det næste program udføres. Her er kodelisten til din reference.

statisk ugyldigt Main (streng [] args)

 {

Type type = typeof (kunde);

MethodInfo [] methodInfo = type.GetMethods ();

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

foreach (MethodInfo temp i methodInfo)

            {

Console.WriteLine (temp.navn);

            }

Console.Read ();

        }

Bemærk, at du muligvis også får vist navnene på et par yderligere metoder (ToString, Equals, GetHashCode, GetType). Disse metoder nedarves fra objektklassen - enhver klasse i .Net stammer som standard objektklassen.

Du kan også gentage gennem attributterne for en metode. Hvis der er defineret brugerdefinerede attributter til dine metoder, kan du bruge GetCustomAttribute-metoden i forekomsten af ​​MethodInfo-klassen til at hente attributterne til metoden. Her er hvordan du kan opnå dette.

foreach (MethodInfo temp i methodInfo)

 {

foreach (Attribut attribut i temp.GetCustomAttributes (true))

     {

// Skriv din sædvanlige kode her

     }

  }

Så hvis du dekorerer dine forretningsobjekter ved hjælp af attributter i din applikation, kan du drage fordel af refleksion for at reflektere over typen, hente attributterne for metoderne af din type og derefter udføre en handling i overensstemmelse hermed.