Ohjelmointi

Kuinka työskennellä heijastuksen kanssa C #: ssä

C #: n heijastusta käytetään tyypin metatietojen hakemiseen ajon aikana. Toisin sanoen, heijastuksen avulla voit tarkastaa ohjelman tyyppien metatiedot dynaamisesti - voit noutaa tietoja ladatuista kokoonpanoista ja niissä määritetyistä tyypeistä. Heijastus C #: ssa on samanlainen kuin C ++: n RTTI (Runtime Type Information).

Jos haluat työskennellä .Netissä heijastuksen kanssa, sinun on sisällytettävä System.Reflection-nimitila ohjelmaasi. Heijastuksen avulla saat tyypin "tyyppi" esineitä, joita voidaan käyttää kuvaamaan kokoonpanoja, tyyppejä tai moduuleja. Heijastuksen avulla voit luoda tyypin esiintymän dynaamisesti ja jopa kutsua tyypin menetelmiä.

System.Reflection-nimiavaruudessa määritetyt tyypit sisältävät seuraavat.

  • Kokoaminen
  • Moduuli
  • Enum
  • MethodInfo
  • Rakentajainfo
  • MemberInfo
  • ParametriInfo
  • Tyyppi
  • FieldInfo
  • EventInfo
  • PropertyInfo

Kaivetaan nyt koodiin, jotta pohdinta voidaan toteuttaa. Harkitse seuraavaa luokkaa nimeltä Asiakas.

julkisen luokan asiakas

    {

public int Id

        {

saada; aseta;

        }

julkinen merkkijono Etunimi

        {

saada; aseta;

        }

julkinen merkkijono Sukunimi

        {

saada; aseta;

        }

julkinen merkkijono Osoite

        {

saada; aseta;

        }

    }

Seuraava koodinpätkä osoittaa, kuinka voit saada asiakasluokan nimen ja nimitilan nimen heijastuksen avulla:

Type type = typeof (Asiakas);

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

Console.WriteLine ("Nimitila:" + type.Namespace);

Seuraava koodinpätkä kuvaa, kuinka voit hakea luettelon asiakasluokan ominaisuuksista ja näyttää heidän nimensä konsoli-ikkunassa:

staattinen void Main (merkkijono [] args)

        {

Type type = typeof (Asiakas);

PropertyInfo [] propertyInfo = type.GetProperties ();

Console.WriteLine ("Luettelo asiakasluokan ominaisuuksista on: -");

foreach (PropertyInfo pInfo in propertyInfo)

            {

Console.WriteLine (pInfo.Name);

            }

        }

Type-luokan GetProperties () -metodi palauttaa taulukon, jonka tyyppi on PropertyInfo - tämä on itse asiassa luettelo tyypin julkisista ominaisuuksista. Tämän jälkeen voit toistaa tämän taulukon ja hakea kaikkien tyypissäsi määritettyjen julkisten ominaisuuksien nimet. Koska asiakasluokka määrittelee kolme ominaisuutta, kaikkien näiden kolmen ominaisuuden nimet näytetään konsolissa, kun tämä ohjelma suoritetaan.

Näin voimme näyttää tyypin rakentajien ja julkisten menetelmien metatiedot heijastuksen avulla. Tarkastellaan uudelleen aiemmin luomamme asiakasluokka ja sisällytetään kaksi menetelmää - oletusrakentaja ja Validate-menetelmä, jota käytetään validoimaan sille parametrina välitetty asiakasobjekti. Tältä näyttää muokattu asiakasluokan versio.

julkisen luokan asiakas

    {

julkinen asiakas ()

        {

// Oletusrakentaja

        }

public int Id

        {

saada; aseta;

        }

julkinen merkkijono Etunimi

        {

saada; aseta;

        }

julkinen merkkijono Sukunimi

        {

saada; aseta;

        }

julkinen merkkijono Osoite

        {

saada; aseta;

        }

public bool Validate (Asiakas customerObj)

        {

// Asiakasobjektin vahvistuskoodi

palaa tosi;

        }

    }

Seuraavaa koodinpätkää voidaan käyttää kaikkien asiakasluokkaan kuuluvien rakentajien nimien näyttämiseen. Meillä on vain yksi rakentaja asiakasluokassa - vain yksi olisi listattu.

Type type = typeof (Asiakas);

ConstructorInfo [] constructorInfo = type.GetConstructors ();

Console.WriteLine ("Asiakasluokka sisältää seuraavat rakentajat: -");

foreach (ConstructorInfo c sisään constructorInfo)

  {

Console.WriteLine (c);

  }

Huomaa, että Type-luokan GetConstructors () -menetelmä palauttaa tyypin ConstructorInfo taulukon, joka sisältää luettelon kaikista julkisista rakennuttajista, jotka on määritelty heijastavassa tyypissä.

OK; näytetään nyt kaikkien asiakasluokan julkisten menetelmien nimet - meillä on jälleen yksi, joten vain yhden menetelmän nimi näytetään konsolissa, kun seuraavaksi annettu ohjelma suoritetaan. Tässä on koodiluettelo viitteellesi.

staattinen void Main (merkkijono [] args)

 {

Type type = typeof (Asiakas);

MethodInfo [] methodInfo = type.GetMethods ();

  Console.WriteLine ("Asiakasluokan menetelmät ovat: -");

foreach (MethodInfo-lämpötila MethodInfossa)

            {

Console.WriteLine (temp.Nimi);

            }

Konsoli.Lue ();

        }

Huomaa, että saatat saada myös muutaman lisämenetelmän nimet (ToString, Equals, GetHashCode, GetType). Nämä menetelmät peritään Object-luokasta - mikä tahansa .Net-luokan luokka johtaa oletusarvoisesti Object-luokan.

Voit myös toistaa menetelmän ominaisuuksien kautta. Jos menetelmillesi on määritetty mukautetut määritteet, voit hakea MethodInfo-luokan esiintymässä GetCustomAttributes-menetelmän menetelmän määritteet. Näin voit saavuttaa tämän.

foreach (MethodInfo-lämpötila MethodInfossa)

 {

foreach (Attribuuttimäärite lämpötilassa GetCustomAttributes (true))

     {

// Kirjoita tavallinen koodi tähän

     }

  }

Joten jos sisustat liikeobjektisi käyttämällä sovelluksesi määritteitä, voit hyödyntää pohdintaa ja pohtia tyyppiä, noutaa tyypin menetelmien määritteet ja suorittaa sitten jonkin toiminnon vastaavasti.

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