Programiranje

Kako delati z refleksijo v jeziku C #

Odsev v C # se uporablja za pridobivanje metapodatkov o vrstah med izvajanjem. Z drugimi besedami, z odsevom lahko dinamično pregledujete metapodatke vrst v vašem programu - lahko pridobite informacije o naloženih sklopih in vrstah, opredeljenih v njih. Odsev v jeziku C # je podoben RTTI (Runtime Type Information) C ++.

Če želite delati z refleksijo v .Net, v svoj program vključite imenski prostor System.Reflection. Pri uporabi odseva dobite predmete tipa "Type", ki jih lahko uporabite za predstavitev sklopov, tipov ali modulov. Z odsevom lahko dinamično ustvarite primerek tipa in celo prikličete metode tipa.

Vrste, opredeljene v imenskem prostoru System.Reflection, vključujejo naslednje.

  • Skupščina
  • Modul
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Tip
  • FieldInfo
  • EventInfo
  • PropertyInfo

Poglejmo zdaj nekaj kode, da razmislimo v praksi. Razmislite o naslednjem razredu, imenovanem Stranka.

kupec javnega razreda

    {

javni int Id

        {

dobili; set;

        }

javni niz FirstName

        {

dobili; set;

        }

javni niz Priimek

        {

dobili; set;

        }

javni niz Naslov

        {

dobili; set;

        }

    }

Naslednji delček kode prikazuje, kako lahko z odsevom dobite ime razreda in ime imenskega prostora razreda Customer:

Type type = typeof (kupec);

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

Console.WriteLine ("Prostor imen:" + type.Namespace);

Naslednji delček kode prikazuje, kako lahko pridobite seznam lastnosti razreda Customer in prikažete njihova imena v oknu konzole:

statična praznina Main (string [] args)

        {

Type type = typeof (kupec);

PropertyInfo [] propertyInfo = type.GetProperties ();

Console.WriteLine ("Seznam lastnosti razreda Customer je: -");

foreach (PropertyInfo pInfo v propertyInfo)

            {

Console.WriteLine (pInfo.Name);

            }

        }

Metoda GetProperties () razreda Type vrne polje tipa PropertyInfo - to je pravzaprav seznam javnih lastnosti vašega tipa. Nato lahko to matriko ponovite in pridobite imena vsake javne lastnosti, definirane v vašem tipu. Ker razred Customer definira tri lastnosti, bi bila imena vseh teh treh lastnosti prikazana v konzoli, ko se ta program zažene.

Tukaj je opisano, kako lahko z uporabo refleksije prikažemo metapodatke konstruktorjev in javne metode tipa. Ponovno obiščimo razred Customer, ki smo ga ustvarili prej, in vključimo dve metodi - privzeti konstruktor in metodo, imenovano Validate, ki se uporablja za preverjanje uporabniškega predmeta, ki mu je bil poslan kot parameter. Tako bi izgledala spremenjena različica razreda Customer.

kupec javnega razreda

    {

javni kupec ()

        {

// Privzeti konstruktor

        }

javni int Id

        {

dobili; set;

        }

javni niz FirstName

        {

dobili; set;

        }

javni niz Priimek

        {

dobili; set;

        }

javni niz Naslov

        {

dobili; set;

        }

javni bool Validate (Customer customerObj)

        {

// Koda za preverjanje predmeta stranke

vrni res;

        }

    }

Naslednji delček kode lahko uporabite za prikaz imen vseh konstruktorjev, ki spadajo v razred Customer. V razredu Customer imamo samo en konstruktor - zato bi bil naveden samo en.

Type type = typeof (kupec);

ConstructorInfo [] constructorInfo = type.GetConstructors ();

Console.WriteLine ("Razred Customer vsebuje naslednje konstruktorje: -");

foreach (ConstructorInfo c v constructorInfo)

  {

Console.WriteLine (c);

  }

Upoštevajte, da metoda GetConstructors () razreda Type vrne polje tipa ConstructorInfo, ki vsebuje seznam vseh javnih konstruktorjev, definiranih v tipu, ki se odraža.

V REDU; poglejmo zdaj imena vseh javnih metod razreda Customer - spet imamo samo eno, tako da bo ime samo ene metode prikazano v konzoli, ko se zažene naslednji program. Tu je seznam kod za vašo referenco.

statična praznina Main (string [] args)

 {

Type type = typeof (kupec);

MethodInfo [] methodInfo = type.GetMethods ();

  Console.WriteLine ("Metode razreda Customer so: -");

foreach (MethodInfo temp v methodInfo)

            {

Console.WriteLine (temp.Name);

            }

Console.Read ();

        }

Upoštevajte, da bodo morda prikazana tudi imena nekaj dodatnih metod (ToString, Equals, GetHashCode, GetType). Te metode so podedovane iz razreda Object - kateri koli razred v .Net privzeto izpelje razred Object.

Prav tako lahko ponavljate atribute metode. Če so bili za vaše metode definirani atributi po meri, lahko za pridobitev atributov metode uporabite metodo GetCustomAttributes na primerku razreda MethodInfo. Evo, kako lahko to dosežete.

foreach (MethodInfo temp v methodInfo)

 {

foreach (Atribut atributa v temp.GetCustomAttributes (true))

     {

// Tukaj napišite svojo običajno kodo

     }

  }

Če torej okrasite svoje poslovne predmete z uporabo atributov v svoji aplikaciji, lahko izkoristite razmislek, da razmislite o tipu, pridobite atribute metod vašega tipa in nato ustrezno izvedete nekaj.

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