Kako raditi s refleksijom u C #

Refleksija u C # koristi se za dohvaćanje metapodataka o vrstama tijekom izvođenja. Drugim riječima, pomoću refleksije možete dinamički pregledati metapodatke vrsta u programu - možete dohvatiti podatke o učitanim sklopovima i vrstama definiranim u njima. Refleksija u C # slična je RTTI (Runtime Type Information) C ++.

Da biste radili s refleksijom u .Netu, trebali biste u svoj program uključiti prostor imena System.Reflection. Korištenjem refleksije dobivate objekte tipa "Type" koji se mogu koristiti za predstavljanje sklopova, tipova ili modula. Možete koristiti refleksiju za dinamičko stvaranje instance tipa, pa čak i pozivanje metoda tipa.

Tipovi definirani u prostoru imena System.Reflection uključuju sljedeće.

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

Idemo sada kopati po nekom kodu kako bismo refleksiju aktivirali. Razmotrite sljedeću klasu pod nazivom Kupac.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

Sljedeći isječak koda pokazuje kako pomoću klase možete dobiti naziv klase i naziv prostora klase Customer:

Type type = typeof(Customer);

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

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

Sljedeći isječak koda ilustrira kako možete dohvatiti popis svojstava klase Customer i prikazati njihova imena u prozoru konzole:

static void Main(string[] args)

        {

            Type type = typeof(Customer);

            PropertyInfo[] propertyInfo = type.GetProperties();

            Console.WriteLine("The list of properties of the Customer class are:--");

            foreach (PropertyInfo pInfo in propertyInfo)

            {

                Console.WriteLine(pInfo.Name);

            }

        }

Metoda GetProperties () klase Type vraća niz vrsta PropertyInfo - ovo je zapravo popis javnih svojstava vašeg tipa. Zatim možete ponoviti ovaj niz i dohvatiti imena svakog od javnih svojstava definiranih u vašem tipu. Budući da klasa Customer definira tri svojstva, imena svih ta tri svojstva prikazala bi se u konzoli kada se ovaj program izvrši.

Evo kako možemo prikazati metapodatke konstruktora i javne metode tipa pomoću refleksije. Ponovno posjetimo klasu Customer koju smo ranije stvorili i uključimo dvije metode - zadani konstruktor i metodu zvanu Validate koja se koristi za provjeru valjanosti korisničkog objekta koji joj je proslijeđen kao parametar. Ovako bi izgledala modificirana verzija klase Customer.

public class Customer

    {

        public Customer()

        {

            //Default constructor

        }

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

        public bool Validate(Customer customerObj)

        {

            //Code to validate the customer object

            return true;

        }

    }

Sljedeći isječak koda može se koristiti za prikaz imena svih konstruktora koji pripadaju klasi Customer. Imamo samo jedan konstruktor u klasi Customer - stoga bi bio naveden samo jedan.

Type type = typeof(Customer);           

ConstructorInfo[] constructorInfo = type.GetConstructors();

Console.WriteLine("The Customer class contains the following Constructors:--");

foreach (ConstructorInfo c in constructorInfo)

  {

     Console.WriteLine(c);

  }

Imajte na umu da metoda GetConstructors () klase Type vraća niz tipa ConstructorInfo koji sadrži popis svih javnih konstruktora definiranih u tipu koji se odražava.

U REDU; prikažimo sada imena svih javnih metoda klase Customer - opet, imamo samo jednu pa bi se ime samo jedne metode prikazalo u konzoli kada se izvrši sljedeći program. Evo popisa kodova za vašu referencu.

static void Main(string[] args)

 {

    Type type = typeof(Customer);

    MethodInfo[] methodInfo = type.GetMethods();

     Console.WriteLine("The methods of the Customer class are:--");

            foreach (MethodInfo temp in methodInfo)

            {

              Console.WriteLine(temp.Name);               

            }

            Console.Read();

        }

Imajte na umu da se mogu prikazati i imena nekoliko dodatnih metoda (ToString, Equals, GetHashCode, GetType). Te se metode nasljeđuju iz klase Object - bilo koja klasa u .Net izvodi Object klasu prema zadanim postavkama.

Također možete pregledavati atribute metode. Ako su za vaše metode definirani prilagođeni atributi, možete koristiti metodu GetCustomAttributes na instanci klase MethodInfo za dohvaćanje atributa metode. Evo kako to možete postići.

foreach (MethodInfo temp in methodInfo)

 {

    foreach (Attribute attribute in temp.GetCustomAttributes(true))

     {

         //Write your usual code here

     }

  }

Dakle, ako svoje poslovne objekte ukrašavate pomoću atributa u svojoj aplikaciji, možete iskoristiti refleksiju za refleksiju o tipu, dohvatiti atribute metoda vašeg tipa i zatim u skladu s tim izvršiti neku radnju.