none
Attribute entwickeln RRS feed

  • Frage

  • Hallo,

    ich habe ein eigenes Attribute entwickelt und wollte fragen wie ich in Erfahrung bringen kann welche Klasse oder Funktion dieses Attribut nutzt.

    [MeinAttribute]

    void testvoid() {}

    So nutze ich diesen.

    mfg flo


    Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!

    Freitag, 18. April 2014 14:58

Antworten

  • Hallo,
    an die Attribute einer Methode (oder eines anderes Typs) kommst du per Reflection heran:
    var method = typeof(TestClass).GetMethod("testvoid", BindingFlags.NonPublic | BindingFlags.Instance);//Methode abrufen
    //var attribs = method.GetCustomAttributes(typeof(MeinAttribute));//Attribute deines Typs abrufen
    var attribs = method.GetCustomAttributes();//alle attribute abrufen
    foreach (object attrib in attribs)//Alle Attribute durchgehen
    {
        if (attrib is MeinAttribute)//Abfrage ist nur nötig, wenn du keinen Typ bei der Abfrage spezifiziert hast - siehe auskommentierte Zeile vor foreach
            Console.WriteLine("PositionalString = " + (attrib as MeinAttribute).PositionalString);//Rufe eine Eigenschaft des Attributes ab        
        else
            Console.WriteLine(attrib.GetType().FullName);//Unbekanntes Attribut, Typ ausgeben
    }
    Beim abfragen des Typs musst du die BindingFlags ggf. anpassen. Momentan wird nach nicht öffentlichen (private, protected oder internal) Methoden gesucht, die nicht statisch, d.h. Instanzmember sind. Die auskommentierte Zeile zum abfragen der Attribute fragt nur die Attribute eines Bestimmten Typs ab. Die Zeile darunter alle Attribute jeden Typs.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 18. April 2014 15:23
    Moderator
  • Hallo Flo,

    das Thema Reflection ist doch "ein wenig" zu groß, um das hier behandeln zu können. Die Grundlagen hierfür musst Du dir einfach per Selbststudium (MSDN, ...) aneignen. Bei spezifischen Problemen sind wir natürlich gerne für dich da.

    Einen Einstieg in Reflection findest Du bspw. hier:

      http://msdn.microsoft.com/de-de/library/f7ykdhsy.aspx

    Um die Klassen einer Assembly auszulesen, schau bitte hier:

      http://msdn.microsoft.com/de-de/library/system.reflection.assembly.aspx

    Um die Methoden einer Klasse auszulesen, dann mal hier:

      http://msdn.microsoft.com/de-de/library/4d848zkb.aspx

    ---

    Ich frage mich allerdings, was Du mit "Das Programm soll diese selbst suchen" bezwecken willst. Verrate uns doch ein wenig mehr über deine genauen Anforderungen, evtl. findet sich dann eine bessere Lösung für deine Zwecke.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Montag, 21. April 2014 08:47
    Moderator

Alle Antworten

  • Hallo,
    an die Attribute einer Methode (oder eines anderes Typs) kommst du per Reflection heran:
    var method = typeof(TestClass).GetMethod("testvoid", BindingFlags.NonPublic | BindingFlags.Instance);//Methode abrufen
    //var attribs = method.GetCustomAttributes(typeof(MeinAttribute));//Attribute deines Typs abrufen
    var attribs = method.GetCustomAttributes();//alle attribute abrufen
    foreach (object attrib in attribs)//Alle Attribute durchgehen
    {
        if (attrib is MeinAttribute)//Abfrage ist nur nötig, wenn du keinen Typ bei der Abfrage spezifiziert hast - siehe auskommentierte Zeile vor foreach
            Console.WriteLine("PositionalString = " + (attrib as MeinAttribute).PositionalString);//Rufe eine Eigenschaft des Attributes ab        
        else
            Console.WriteLine(attrib.GetType().FullName);//Unbekanntes Attribut, Typ ausgeben
    }
    Beim abfragen des Typs musst du die BindingFlags ggf. anpassen. Momentan wird nach nicht öffentlichen (private, protected oder internal) Methoden gesucht, die nicht statisch, d.h. Instanzmember sind. Die auskommentierte Zeile zum abfragen der Attribute fragt nur die Attribute eines Bestimmten Typs ab. Die Zeile darunter alle Attribute jeden Typs.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 18. April 2014 15:23
    Moderator
  • Hallo und Frohe Ostern!

    Super, dankeschön! Jetzt wäre noch inteteressant wie ich alle Klassen und die jeweils darin enthaltenen Methoden abfragen kann. Ich möchte Sie quasi nicht vorher bekannt geben müssen. Das Programm soll diese selbst suchen!

    Hättest du da noch ne lösung?

    MfG Flo


    Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!

    Montag, 21. April 2014 08:33
  • Hallo Flo,

    das Thema Reflection ist doch "ein wenig" zu groß, um das hier behandeln zu können. Die Grundlagen hierfür musst Du dir einfach per Selbststudium (MSDN, ...) aneignen. Bei spezifischen Problemen sind wir natürlich gerne für dich da.

    Einen Einstieg in Reflection findest Du bspw. hier:

      http://msdn.microsoft.com/de-de/library/f7ykdhsy.aspx

    Um die Klassen einer Assembly auszulesen, schau bitte hier:

      http://msdn.microsoft.com/de-de/library/system.reflection.assembly.aspx

    Um die Methoden einer Klasse auszulesen, dann mal hier:

      http://msdn.microsoft.com/de-de/library/4d848zkb.aspx

    ---

    Ich frage mich allerdings, was Du mit "Das Programm soll diese selbst suchen" bezwecken willst. Verrate uns doch ein wenig mehr über deine genauen Anforderungen, evtl. findet sich dann eine bessere Lösung für deine Zwecke.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community




    Montag, 21. April 2014 08:47
    Moderator
  • Hallo,

    ich lade mir nun alle Assemblys, dann die darin enthaltenen Typen, dann die Methoden. Anschließend prüfe ich ob eines davon (mehrere) mein Attribut nutzen. Klappt wunderbar!

    Ich habe vor langem ein kleines "Security"-Framework geschrieben. Dieses ist eine Schnittstelle. Und sobald sich der Nutzerlevel (Admin, Hauptnutzer, Gast) ändert, wird eine vom Interface vorgegebene Methode aufgerufen welche dann z.B. bestimmte Buttons aktiviert, oder deaktiviert.

    Nun möchte ich dies über Attribute machen. Jede Methode die dieses Attribute hat wird bei einer Änderung selbstständig vom Framework ausgeführt, und der entsprechende Button (oder anderes Control) wird von der Methode selbst gesperrt, versteckt etc.

    Einen Schritt mehr automatismus + Flexibilität!

    MfG Flo


    Die Taschenlampe - Die Erleuchtung für ihr Windows Phone! ------------- Sie wollen selbst APP-Programmierer werden? Kommen Sie auf www.flogersoft.de -> Tutorials und erstellen Sie ihre erste, eigene APP!

    Dienstag, 22. April 2014 13:01
  • Hi,

                     

    Ist Deine Situation eigentlich abgeklärt ? Können wir den Thread schließen ? Wenn ja - bitte markiere die hilfreichen Beiträge "als Antwort".

     

    Viele Grüße,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Mittwoch, 23. April 2014 13:45