Programmēšana

Kā strādāt ar refleksiju C #

Refleksija C # tiek izmantota, lai izpildes laikā izgūtu metadatus par tipiem. Citiem vārdiem sakot, jūs varat izmantot refleksiju, lai dinamiski pārbaudītu jūsu programmas veidu metadatus - jūs varat iegūt informāciju par ielādētajiem mezgliem un tajos definētajiem tipiem. Refleksija C # ir līdzīga C ++ RTTI (Runtime Type Information).

Lai strādātu ar refleksiju .Net, programmā jāiekļauj vārda zona System.Reflection. Izmantojot atspulgu, jūs saņemat objektus, kuru tips ir "tips", kurus var izmantot, lai attēlotu komplektus, tipus vai moduļus. Jūs varat izmantot refleksiju, lai dinamiski izveidotu tipa instanci un pat izmantotu tipa metodes.

Sistēmas Reflection nosaukumvietā definētie veidi ietver sekojošo.

  • Montāža
  • Modulis
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Tips
  • FieldInfo
  • EventInfo
  • PropertyInfo

Tagad iedziļināsimies kādā kodā, lai liktu lietā pārdomas. Apsveriet šādu klasi ar nosaukumu Klients.

sabiedriskās klases klients

    {

public int Id

        {

gūt; komplekts;

        }

publiskā virkne Vārds

        {

gūt; komplekts;

        }

publiskā virkne Uzvārds

        {

gūt; komplekts;

        }

publiskā virkne Adrese

        {

gūt; komplekts;

        }

    }

Šis koda fragments parāda, kā, izmantojot refleksiju, varat iegūt klases nosaukumu un klienta klases nosaukumvietas nosaukumu:

Type type = typeof (Klients);

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

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

Šis koda fragments parāda, kā jūs varat izgūt klientu klases rekvizītu sarakstu un parādīt to nosaukumus konsoles logā:

static void Main (virkne [] args)

        {

Type type = typeof (Klients);

PropertyInfo [] propertyInfo = type.GetProperties ();

Console.WriteLine ("Klientu klases īpašību saraksts ir: -");

foreach (PropertyInfo pInfo in propertyInfo)

            {

Console.WriteLine (pInfo.Name);

            }

        }

Klases Type metode GetProperties () atgriež masīva veidu PropertyInfo - tas faktiski ir jūsu veida publisko rekvizītu saraksts. Pēc tam jūs varat atkārtot šo masīvu un izgūt katra publiskajā īpašumā, kas definēts jūsu tipā, nosaukumus. Tā kā klientu klasē ir definēti trīs rekvizīti, visu šo trīs rekvizītu nosaukumi tiks parādīti konsolē, izpildot šo programmu.

Lūk, kā mēs varam atspoguļot kāda veida konstruktoru un publisko metožu metadatus. Apskatīsim iepriekš izveidoto klientu klasi un iekļausim divas metodes - noklusējuma konstruktoru un metodi Validate, kuru izmanto, lai apstiprinātu klienta objektu, kas tam nodots kā parametrs. Šādi izskatītos Klientu klases modificētā versija.

sabiedriskās klases klients

    {

publiskais klients ()

        {

// Noklusējuma konstruktors

        }

public int Id

        {

gūt; komplekts;

        }

publiskā virkne Vārds

        {

gūt; komplekts;

        }

publiskā virkne Uzvārds

        {

gūt; komplekts;

        }

publiskā virkne Adrese

        {

gūt; komplekts;

        }

public bool Validate (klienta customerObj)

        {

// Kods klienta objekta validēšanai

atgriezties taisnība;

        }

    }

Šādu koda fragmentu var izmantot, lai parādītu visu konstruktoru vārdus, kas pieder Klientu klasei. Klientu klasē mums ir tikai viens konstruktors - tātad tiks uzskaitīts tikai viens.

Type type = typeof (Klients);

ConstructorInfo [] constructorInfo = type.GetConstructors ();

Console.WriteLine ("Klientu klasē ir šādi konstruktori: -");

foreach (ConstructorInfo c in constructorInfo)

  {

Console.WriteLine (c);

  }

Ņemiet vērā, ka tipa GetConstructors () metode atgriež ConstructorInfo tipa masīvu, kurā ir visu publisko konstruktoru saraksts, kas definēti atspoguļotajā tipā.

LABI; tagad parādīsim visu klientu klases publisko metožu nosaukumus - atkal mums tāds ir, tāpēc, izpildot nākamo programmu, konsolē tiks parādīts tikai vienas metodes nosaukums. Šeit ir norādīts kodu saraksts.

static void Main (virkne [] args)

 {

Type type = typeof (Klients);

MethodInfo [] methodInfo = type.GetMethods ();

  Console.WriteLine ("Klientu klases metodes ir: -");

foreach (MethodInfo temp in methodInfo)

            {

Console.WriteLine (temp.Name);

            }

Konsole. Lasīt ();

        }

Ņemiet vērā, ka, iespējams, parādīsit arī dažu papildu metožu nosaukumus (ToString, Equals, GetHashCode, GetType). Šīs metodes tiek mantotas no klases Object - jebkura .Net klase pēc noklusējuma iegūst Object klasi.

Varat arī atkārtot, izmantojot metodes atribūtus. Ja jūsu metodēm ir definēti pielāgoti atribūti, varat izmantot metodi GetCustomAttributes klases MethodInfo instancē, lai izgūtu metodes atribūtus. Lūk, kā jūs to varat sasniegt.

foreach (MethodInfo temp in methodInfo)

 {

foreach (atribūta atribūts temp.GetCustomAttributes (true))

     {

// Šeit pierakstiet savu parasto kodu

     }

  }

Tātad, ja dekorējat biznesa objektus, izmantojot lietojumprogrammas atribūtus, varat izmantot pārdomu iespējas, lai pārdomātu veidu, izgūtu sava veida metožu atribūtus un pēc tam attiecīgi veiktu kādu darbību.

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