Frage

Hintergrund

Ich habe ein paar Skripte, die als Teil meines Build-Prozesses ausführen, die auf den verschiedenen Quellcodedateien suchen und generieren für mich etwas mehr Quellcode.

Die Skripte verwenden CodeDom sie zu erzeugen und sie lesen Sie die .cs Dateien mit einem einfachen Textleser.

Frage

Eines der Skripte sucht Verwendung einer bestimmten Klasse Attribut namens PageMenuItem und ihr Zweck ist eine statische Liste der Seite Menüpunkte zu bauen.

Es tut dies jetzt durch all die .cs Dateien lesen und sucht nach "PageMenuItem" Attribute, dann ist es die Anzahl der Argumente zählt und versucht, herauszufinden, welche Konstruktor verwendet wird, so dass es auseinander, die verschiedenen Informationen ziehen können.

Es gibt 7 Konstrukteure für PageMenuItem mit verschiedenen Parametern ab, so ist es immer sehr schwierig, aus dem .cs Quellcode zu ermitteln, den Konstruktor verwendet wird und daher, wie die Informationen zu analysieren, aus.

Statt der Text selbst zu versuchen, zu analysieren, ich mag einfach ein PageMenuItem Objekt im Speicher konstruieren und dann seine Eigenschaften verwenden.

So, ich brauche einen Weg, um die Attributdeklaration aus der .cs Datei zu nehmen und eine neue Instanz von PageMenuItem daraus konstruieren.

Ist das möglich?


Eine andere Möglichkeit, diese Frage zu stellen:

In Anbetracht dieser Zeichenfolge:

string myCodeStatement = "[MyAttribute(\"asdf\", \"foo\")]";

Wie kann ich ein Objekt vom Typ MyAttribute erstellen, so dass ich mit diesem Objekt arbeiten kann? Ich habe vollen Zugriff auf den Quellcode, den MyAttribute definiert.

War es hilfreich?

Lösung 4

Dieses Skript ist Teil des Build-Prozesses, so muss es ziemlich schnell sein. Außerdem erzeugt es Quellcode, erhalten kompiliert wird sich, so will ich „double Compilieren“ mein Projekt vermeiden.

ich auch nicht wollen, um eine Anordnung zu haben zu kompilieren und laden nur dagegen zu reflektieren, die „teuer“ scheint mehrere hundert Mal während meiner Build-Prozess zu tun.

Ich entschied, dass ich nur zu reparieren benötigen, wie ich die Attribute jetzt bin Parsen. ---

Ich lese schon den Quellcode und zu versuchen, die Anzahl der Attribute zu zählen. Ich beschloss, ich könnte diesen Code ändern, um nur die Argumente in ihre Typen zu analysieren und dann verwenden Activator.CreateInstance() meine analysiert Argumente verwenden. Activator wird herauszufinden, welche Konstruktor zu verwenden, und ich werde eine Instanz meiner Attributklasse erhalten und kann seine Eigenschaften verwenden.

Ich weiß schon, welche Arten in dem Attribute Konstruktor zur Verfügung steht, so schrieb ich eine wenig Methode, die das Zeug zwischen den Parans in ihren richtigen Typen parst (string, int, guid, usw.) und dann gebe ich das Objekt Array die Activator.

Der Aktivator hat die harte Arbeit den richtigen Konstruktor zu finden und gibt mir eine Instanz meiner Attributklasse zurück.

Andere Tipps

Scheint, wie Sie die Klassendateien introspect könnte, oder alternativ eine Anmerkung an den Konstruktor hinzufügen, die Ihre Parsing Job einfacher machen würde. Aspect orientierte Techniken helfen können - erfassen jedes Mal, dass Konstruktor aufgerufen wird, und wie es ist, fügen Sie den Artikel auf Ihre Liste.

Sie können mit der CSharpCodeProvider tun diese. Es gibt ein Microsoft Support-Artikel den Prozess zu beschreiben.

Ist das Aufrufen der Compiler eine Option? Sie könnten die Quelldateien selbst erstellen und verwenden Reflektion, um die Attribute zu gehen, oder Sie können eine Dummy-Quelldatei erstellen, die Sie mit diesen Attributen markieren. So oder so, sobald es zusammengestellt ist, können Sie in reflektieren, um die Eigenschaften des Attributs zugreifen zu können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top