2016-06-12 1 views
0

Für die Klasse zu überprüfen:C# Reflexionsverfahren Körper Zuordnung unten an Feldern

class A 
{ 
    private List<int> intList; 
    private List<bool> boolList; 

    public InitializeClass() 
    { 
     intList = new List<int>(); 
    } 

} 

Ich möchte Reflexion verwenden, um einen Linter/post-Compiler von Art zu schreiben, zu überprüfen, ob eine bestimmte Methode wirklich jede Zuordnung haben zu den Klassenfeldern oder nicht. Der Zweck ist, meine eigenen Fehler automatisch zu überprüfen. Die Klasse kann keinen Konstruktor verwenden, daher muss ich InitializeClass() manuell aufrufen.

Ich habe MethodInfo method und alle Felder der Klasse FieldInfo[] fields, die ich bereits überprüfen wollte, aber keine Ahnung, wie man von hier aus geht. Aus dem obigen Beispiel sollte er erkennen können, dass ich boolList im Methodenkörper nichts zugewiesen habe.

+0

Gibt es einen Grund, warum Sie dies aus dem kompilierten Code tun müssen? Die Verwendung der Roslyn-API wäre eine viel einfachere Möglichkeit, den Code zu analysieren. –

+0

Ja, das ist eigentlich Unity3D Plugin. Unity kann nach dem Kompilieren im Programm selbst eine beliebige statische C# -Methode ausführen. Daher wollte ich dort den Checker ausführen, um alle Skripts zu analysieren, die ich in der aktuellen Szene verwende. – 5argon

+0

Aber wissen Sie nicht wirklich den Code, den Sie zur Build-Zeit überprüfen möchten? Wie viel Aufwand sind Sie bereit, dies zur Ausführungszeit gegenüber der Buildzeit zu unterstützen? Ich vermute, dass das Finden einer IL-Parsing-Bibliothek, die auf Unity funktioniert, eine große Herausforderung sein wird. –

Antwort

0

Ich habe die Code-Datei direkt mit regulären Ausdruck gelesen. Die Datei hat einige Einschränkungen, dh sie kann unbegrenzte Methoden enthalten, aber jede Methode darf keine Klammern enthalten. (Nein wenn, etc.)

Dann benutze ich "({)(.*)(})" und wähle die zweite Gruppe, um Klasse Klammer zu beseitigen, dann habe ich "{(.*?)}" und iterieren durch Matches für jede Methode Körper. (Ich interessiere mich nicht für den Namen der Methode, ich möchte die gesamte Datei überprüfen) Danach lese ich den Inhalt der Methode Zeile für Zeile und teile Dinge mit Zeichen wie '=' oder '.'