So arbeiten Sie mit Attributen in C #

Attribute sind eine leistungsstarke Funktion in der Programmiersprache C #, mit der Sie Ihren Assemblys Metadateninformationen hinzufügen können.

Ein Attribut ist tatsächlich ein Objekt, das einem dieser Elemente zugeordnet ist: Assembly, Klasse, Methode, Delegat, Aufzählung, Ereignis, Feld, Schnittstelle, Eigenschaft und Struktur. Sie können verwendet werden, um deklarative Informationen zuzuordnen. Sie können diese Informationen zur Laufzeit zu einem späteren Zeitpunkt abrufen, wenn Sie Reflection verwenden müssen. Mit anderen Worten, Sie können Attribute verwenden, um zusätzliche Informationen in die Assemblys einzufügen, die zur Laufzeit bei Bedarf mithilfe von Reflection abgefragt werden können. Ein Attribut besteht aus seinem Namen und optional einer Liste von Parametern. Der Attributname entspricht der Attributklasse.

Sie können Attribute nutzen, um die Geschäftsobjekte in Ihrer Anwendung zu validieren. Es gibt zwei Arten von Attributen - intrinsische Attribute und benutzerdefinierte Attribute. Während Ersteres als Teil des .Net-Frameworks verfügbar ist, kann Letzteres implementiert werden, indem eine Klasse aus der System.Attribute-Klasse abgeleitet wird. In der MSDN heißt es: "Ein Attribut ist eine zusätzliche deklarative Information, die für eine Deklaration angegeben wird."

Kommen wir nun zu einem Code. Das Attribut "Veraltet" kann verwendet werden, um eine Methode als veraltet zu kennzeichnen - eine Methode, die nicht mehr verwendet werden sollte, da sie nicht mehr benötigt wird oder eine andere Alternative bietet. Das folgende Codeausschnitt zeigt, wie Sie das Obsolete-Attribut über einer Methodendeklaration verwenden können.

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

Wenn Sie diese Methode in Ihrem Code verwenden und Ihr Programm kompilieren, wird im Ausgabefenster der Visual Studio-IDE eine Warnung angezeigt. Sie können diese Warnung also ignorieren, wenn Sie möchten. Was ist, wenn Ihre Entwickler diese Methode überhaupt nicht verwenden sollen? Nun, Sie können dann den zweiten Parameter verwenden (dies ist jedoch optional), während Sie das Attribut "Veraltet" deklarieren. Hier ist die modifizierte Version der DoSomeWork () -Methode. Beachten Sie diesmal die Verwendung des Booleschen Parameters.

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

Wenn Sie diesmal "true" als zweiten optionalen Parameter übergeben und Ihr Programm kompilieren, wird der Code überhaupt nicht kompiliert. Das wollten Sie doch, oder?

Benutzerdefinierte Attribute

In diesem Abschnitt werden wir untersuchen, wie wir benutzerdefinierte Attribute implementieren können. Benutzerdefinierte Attribute sind Klassen, die die System.Attribute-Klasse erben. Um eine benutzerdefinierte Attributklasse zu implementieren, erstellen Sie eine neue Klasse und leiten Sie sie wie unten gezeigt von der System.Attribute-Klasse ab.

using System;

public class CustomAttribute : Attribute

{

}

Um die Verwendung benutzerdefinierter Attribute zu steuern, können Sie die AttributeUsage-Klasse nutzen. Diese Klasse enthält Eigenschaften wie ValidOn, AllowMultiple und Inherited, mit denen Sie die Verwendung Ihres benutzerdefinierten Attributs steuern können.

Der folgende Codeausschnitt zeigt eine modifizierte Version unserer benutzerdefinierten Attributklasse. Beachten Sie die Verwendung eines Konstruktors, der eine Zeichenfolge als Argument akzeptiert und sie dem privaten Zeichenfolgenmitglied der Klasse zuweist. Dies dient nur zu Illustrationszwecken.

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Sie können auch die Attributziele angeben, auf die Ihr benutzerdefiniertes Attribut angewendet werden soll. So können Sie es machen.

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Mit Reflection können Sie jetzt alle Attribute anzeigen, die mit dem folgenden Codeausschnitt auf ein bestimmtes Objekt angewendet werden.

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

Betrachten Sie nun die folgende Klasse, auf die wir unser benutzerdefiniertes Attribut anwenden würden.

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

Beachten Sie, wie das benutzerdefinierte Attribut verwendet und ein Text als Argument übergeben wurde. Das folgende Codeausschnitt zeigt, wie Sie den Inhalt der Text-Eigenschaft drucken können.

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}