Hur man arbetar med reflektion i C #

Reflektion i C # används för att hämta metadata om typer vid körning. Med andra ord kan du använda reflektion för att inspektera metadata för typerna i ditt program dynamiskt - du kan hämta information om de laddade enheterna och de typer som definieras i dem. Reflektion i C # liknar RTTI (Runtime Type Information) för C ++.

För att arbeta med reflektion i .Net bör du inkludera namnet Space.Reflection i ditt program. När du använder reflektion får du objekt av typen "Typ" som kan användas för att representera sammansättningar, typer eller moduler. Du kan använda reflektion för att skapa en instans av en typ dynamiskt och till och med åberopa metoder av typen.

De typer som definieras i System.Reflection-namnområdet inkluderar följande.

  • hopsättning
  • Modul
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Typ
  • FieldInfo
  • EventInfo
  • PropertyInfo

Låt oss nu gräva in lite kod för att genomföra reflektion. Tänk på följande klass som heter Kund.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

Följande kodavsnitt visar hur du kan få klassnamnet och namnutrymmet för kundklassen med hjälp av reflektion:

Type type = typeof(Customer);

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

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

Följande kodavsnitt illustrerar hur du kan hämta listan över egenskaperna för kundklassen och visa deras namn i konsolfönstret:

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);

            }

        }

Metoden GetProperties () för typklassen returnerar en matris av typen PropertyInfo - detta är faktiskt en lista över de offentliga egenskaperna för din typ. Du kan sedan itera den här matrisen och hämta namnen på var och en av de offentliga egenskaper som definierats i din typ. Eftersom kundklassen definierar tre egenskaper, kommer namnen på alla dessa tre egenskaper att visas i konsolen när programmet körs.

Så här kan vi visa metadata för konstruktörer och offentliga metoder av en typ med hjälp av reflektion. Låt oss se över kundklassen vi skapade tidigare och införliva två metoder - en standardkonstruktör och en metod som kallas Validera som används för att validera kundobjektet som skickas till det som en parameter. Så här ser den modifierade versionen av kundklassen ut.

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;

        }

    }

Följande kodavsnitt kan användas för att visa namnen på alla konstruktörer som tillhör kundklassen. Vi har bara en konstruktör i kundklassen - därför skulle bara en listas.

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);

  }

Observera att metoden GetConstructors () i klassen Type returnerar en matris av typen ConstructorInfo som innehåller listan över alla offentliga konstruktörer som definierats i den typ som reflekteras.

OK; låt oss nu visa namnen på alla offentliga metoder i kundklassen - igen, vi har bara en så att namnet på bara en metod skulle visas i konsolen när nästa program körs. Här är kodlistan för din referens.

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();

        }

Observera att du kan få namnen på några ytterligare metoder (ToString, Equals, GetHashCode, GetType) också. Dessa metoder ärvs från Object-klassen - vilken klass i .Net som helst härrör från Object-klassen.

Du kan också iterera genom attributen för en metod. Om anpassade attribut har definierats för dina metoder kan du använda GetCustomAttributes-metoden i förekomsten av MethodInfo-klassen för att hämta attributen för metoden. Så här kan du uppnå detta.

foreach (MethodInfo temp in methodInfo)

 {

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

     {

         //Write your usual code here

     }

  }

Så, om du dekorerar dina affärsobjekt med attribut i din applikation, kan du dra nytta av reflektion för att reflektera över typen, hämta attributen för metoderna av din typ och sedan utföra en åtgärd därefter.