Todo-Attribut

Aus Das Sopra Wiki

Wechseln zu: Navigation, Suche


Dieser Artikel zeigt die Erstellung eines Todo-Attributs, das in den Code eingefügt und verwendet werden kann. Es existiert zwar bereits eine Todo-Möglichkeit im VisualStudio (indem man bei Kommentarzeilen das Wort "TODO: " schreibt gefolgt vom Todo-Text), aber man kann dies auch mit einem Attribut bewerkstelligen.

Zunächst muss die Attributklasse deklariert werden. Es wird ein Datum, der Name des Programmierers und ein Todo-Text benötigt. Man kann sich aber außerdem noch vorstellen, Dinge wie eine Gewichtung hinzuzufügen. Also von "wichtig" bis "unwichtig". Hier wird aber nur kurz auf die Erstellung einer solchen Klasse eingegangen. Die Verwendung und Implementierung selbst kann dann darauf basierend angepasst werden. Als Parameter soll dem Attribut nur der Text übergeben werden müssen, die beiden anderen Parameter sollen bereits benannt sein.

Das Attribut selbst wird nur auf Klassen anwendbar sein, dafür aber mehrfach. Es soll allerdings nicht vererbt werden. In diesem Beispiel wird das Attribut in eine eigene DLL gepackt, damit es aus mehreren Projekten heraus verwendet werden kann. Wenn es nur aus einem Projekt heraus verwendet werden soll, kann man es auch direkt zu seinem Projekt hinzufügen.

Zunächst muss mit der Attributdefinition begonnen werden:

using System;
 
namespace TodoAtt
{
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
    class TodoAttribute : Attribute
    {
        /*
         * Felder privat
         */
        private string programmer = String.Empty;
        private string item = String.Empty;
        private string todoDate = DateTime.Now.ToShortDateString();
 
        /*
         * Eigenschaften öffentlich
         */
        public string Programmer
        {
            get { return this.programmer; }
            set { this.programmer = value; }
        }
 
        public string Item
        {
            get { return this.item; }
            set { this.item = value; }
        }
 
        public string TodoDate
        {
            get { return this.todoDate; }
            set { this.todoDate = value; }
        }
 
        public override string ToString()
        {
            return this.programmer + " / " +
               this.todoDate + " :: " +
               this.item;
        }
 
        /*
         * Konstruktor
         */
        public TodoAttribute(string todoItem)
        {
            this.item = todoItem;
            // Windows-Benutzernamen laden
            this.programmer = System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\')[1].ToString();
        }
    }
}

Der obige Code erzeugt ein einfaches Todo-Attribut. Um dieses jetzt in einem Programm über Reflection auszulesen, wird der folgende Code verwendet:

using System;
using TodoAtt;
using System.Reflection;
 
namespace TestProgram
{
   [Todo("Implementiere noch eine Suche", TodoDate="01.11.2009")]
   class Testclass1     // Diese Klasse wurde mit TODO-Text und Fälligkeitsdatum Versehen
   {
   }
 
   [Todo("Unbedingt noch die Fehlenden Methoden implementieren")]
   class Program        // Diese Klasse wurde mit einem TODO-Text versehen
   {
       // Gibt die Todo-Liste aller Todo-Attribute aus
       static void PrintTodoList()
       {
           // Laden des Assemblys, in dem sich die aktuelle Klasse befindet
           Assembly ass = Assembly.GetAssembly(typeof(Program));
 
           // Definition des TodoAttribute-Typs
           Type todoAttType = typeof(TodoAttribute);
 
           // Typen durchlaufen
           foreach (Type t in ass.GetTypes())
           {
               object[] attribs = t.GetCustomAttributes(todoAttType, false);
 
               // Wenn der aktuelle Typ ein Attribut hat:
               if (attribs.Length != 0)
               {
                   // Todo für diesen Typen ausgeben
 
                   Console.WriteLine(t.FullName + ":");
 
                   foreach (Attribute att in attribs)
                       Console.WriteLine(att.ToString());
 
                   Console.WriteLine();
               }
           }
       }
 
       static void Main(string[] args)
       {
           // Die Todo-Liste nur im DEBUG-Modus anzeigen
           #if DEBUG
           PrintTodoList();
           #endif
 
           Console.ReadLine();
       }
   }
}

Dies Resultiert in der Ausgabe:

TestProgram.Testclass1:
<UserName> / 01.11.2009 :: Implementiere noch eine Suche
 
TestProgram.Program:
<UserName> / 04.11.2009 :: Unbedingt noch die Fehlenden Methoden implementieren

Der Benutzer sieht nun sofort, was noch zu tun ist. Wenn mehrere Benutzer an einem Projekt arbeiten, kann es Hilfreich sein, den Attributaufruf ein wenig abzuändern:

[Todo("Das muss ich noch ändern", Programmer="Bernd", TodoDate="01.11.2009")]
class class1
{ }

Dies fügt tatsächlich den bearbeitenden Benutzer in die Todo-Liste hinzu und überschreibt das TODO nicht jedes Mal mit dem eigenen Benutzer.

Referenz

  • Die Codebeispiele basieren auf Frank Eller und Michael Kofler, "Visual C# - Grundlagen, Programmiertechniken, Windows-Programmierung", Addison-Wesley. ISBN 3-8273-2255-3, Seiten 195-200
Persönliche Werkzeuge