Wie man mit Reflexion in C # arbeitet

Die Reflexion in C # wird verwendet, um zur Laufzeit Metadaten zu Typen abzurufen. Mit anderen Worten, Sie können Reflection verwenden, um Metadaten der Typen in Ihrem Programm dynamisch zu überprüfen. Sie können Informationen zu den geladenen Assemblys und den darin definierten Typen abrufen. Die Reflexion in C # ähnelt RTTI (Runtime Type Information) von C ++.

Um mit Reflection in .Net zu arbeiten, sollten Sie den System.Reflection-Namespace in Ihr Programm aufnehmen. Bei Verwendung von Reflection erhalten Sie Objekte vom Typ "Typ", mit denen Baugruppen, Typen oder Module dargestellt werden können. Sie können Reflection verwenden, um eine Instanz eines Typs dynamisch zu erstellen und sogar Methoden des Typs aufzurufen.

Die im System.Reflection-Namespace definierten Typen umfassen Folgendes.

  • Versammlung
  • Modul
  • Aufzählung
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Art
  • FieldInfo
  • EventInfo
  • PropertyInfo

Lassen Sie uns nun einen Code untersuchen, um die Reflexion in die Tat umzusetzen. Betrachten Sie die folgende Klasse namens Kunde.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

Das folgende Codeausschnitt zeigt, wie Sie den Klassennamen und den Namespace-Namen der Kundenklasse mithilfe von Reflection abrufen können:

Type type = typeof(Customer);

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

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

Das folgende Codeausschnitt zeigt, wie Sie die Liste der Eigenschaften der Kundenklasse abrufen und deren Namen im Konsolenfenster anzeigen können:

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

            }

        }

Die GetProperties () -Methode der Type-Klasse gibt ein Array vom Typ PropertyInfo zurück - dies ist tatsächlich eine Liste der öffentlichen Eigenschaften Ihres Typs. Sie können dieses Array dann iterieren und die Namen aller in Ihrem Typ definierten öffentlichen Eigenschaften abrufen. Da die Customer-Klasse drei Eigenschaften definiert, werden die Namen aller dieser drei Eigenschaften in der Konsole angezeigt, wenn dieses Programm ausgeführt wird.

Hier erfahren Sie, wie Sie die Metadaten der Konstruktoren und öffentlichen Methoden eines Typs mithilfe von Reflection anzeigen können. Lassen Sie uns die zuvor erstellte Kundenklasse erneut betrachten und zwei Methoden einbeziehen - einen Standardkonstruktor und eine Methode namens Validate, mit der das als Parameter an sie übergebene Kundenobjekt validiert wird. So würde die modifizierte Version der Kundenklasse aussehen.

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;

        }

    }

Das folgende Codefragment kann verwendet werden, um die Namen aller Konstruktoren anzuzeigen, die zur Kundenklasse gehören. Wir haben nur einen Konstruktor in der Kundenklasse - daher wird nur einer aufgelistet.

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

  }

Beachten Sie, dass die GetConstructors () -Methode der Type-Klasse ein Array vom Typ ConstructorInfo zurückgibt, das die Liste aller öffentlichen Konstruktoren enthält, die in dem Typ definiert sind, der wiedergegeben wird.

IN ORDNUNG; Lassen Sie uns nun die Namen aller öffentlichen Methoden der Customer-Klasse anzeigen. Auch hier haben wir nur eine, sodass der Name nur einer Methode in der Konsole angezeigt wird, wenn das als nächstes angegebene Programm ausgeführt wird. Hier ist die Codeliste als Referenz.

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

        }

Beachten Sie, dass möglicherweise auch die Namen einiger zusätzlicher Methoden (ToString, Equals, GetHashCode, GetType) angezeigt werden. Diese Methoden werden von der Object-Klasse geerbt. Jede Klasse in .Net leitet standardmäßig die Object-Klasse ab.

Sie können auch die Attribute einer Methode durchlaufen. Wenn für Ihre Methoden benutzerdefinierte Attribute definiert wurden, können Sie die GetCustomAttributes-Methode für die Instanz der MethodInfo-Klasse verwenden, um die Attribute der Methode abzurufen. So können Sie dies erreichen.

foreach (MethodInfo temp in methodInfo)

 {

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

     {

         //Write your usual code here

     }

  }

Wenn Sie also Ihre Geschäftsobjekte mithilfe von Attributen in Ihrer Anwendung dekorieren, können Sie die Reflexion nutzen, um über den Typ nachzudenken, die Attribute der Methoden Ihres Typs abzurufen und dann eine entsprechende Aktion auszuführen.