2016-06-30 11 views
-3

Tl; DR;
Was ist die Regex, um C# -Klassen zu finden, die nur eine einzige String-Eigenschaft besitzen? (Keine Verfahren oder andere Eigenschaften)Klassen mit einer einzigen Eigenschaft finden

Long Story:
ich jetzt führende Tech leitet ein Team, das mehrere Lösungen erhalten. Wenn ich mich umsehe, habe ich viele Fälle von Dictionary<string, SpecialValue> herausgefunden, wobei SpecialValue eine Klasse ist, die eine einzige öffentliche String-Eigenschaft namens "value" enthält.
Das Idea hier ist, dass die resultierende Json wie {"dictionaryKey":{value:"myValue"}} sein.
Ich möchte herausfinden, wie viele Fälle wir so haben.
Visual Studio kann Regex-Suche verwenden, also ... Was ist die Regex zum Suchen einer Klasse, die eine einzelne String-Eigenschaft hat?

+1

Laufzeit? Ich denke, was Sie brauchen, ist Reflection und nicht Regex – user3185569

+0

nein, es ist nicht auf Laufzeit ... es ist auf Kompilierzeit – Leonardo

+0

Holen Sie sich den Typ mit 'instance.GetType()' oder 'typeof (type)' und dann auf Null-Methoden mit 'type.GetMethods(). Length == 0' und nur eine String-Eigenschaft mit' type.GetProperties(). Length == 1 && type.GetProperties() [0] .PropertyType == typeof (string) '. Sie können ein Einheitentestprojekt für das Kompilierungsszenario ausführen, das für Ihr Projekt ausgeführt wird. – mishamosher

Antwort

0

Ich habe festgestellt, dass Visual Studio-Unterstützung für Regex-Suche ist kurz. Es unterstützt keine \s, \W, \B, und eine Menge mehr Muster.

In der Annahme, dass alle Klassen immer nur eine öffentliche Zeichenfolge auto-Eigenschaft haben, ohne Methoden, Vererbung, Generika, oder was auch immer, als ein Beispiel die Klasse:

class Test 
{ 
    public String Value { get; set; } 
} 

die Regex gegeben durch:

class[\r\n\t\f ]+[^\d]\w*[\r\n\t\f ]*{[\r\n\t\f ]*public[\r\n\t\f ]+(string|String)[\r\n\t\f ]+[^\d]\w*[\r\n\t\f ]*{[\r\n\t\f ]*get[\r\n\t\f ]*;[\r\n\t\f ]*set[\r\n\t\f ]*;[\r\n\t\f ]*}[\r\n\t\f ]*} 

sollte die Mehrheit der Fälle abdecken. Bitte beachte, dass die vorherige Regex auch Klassen erfasst, die sich in Kommentaren oder an einem illegalen Ort befinden. Zum Beispiel werden Klassen, die auskommentiert oder innerhalb von Methoden deklariert sind, von dieser Regex abgefangen, da sie nur nach String-Literalen sucht und nicht die gesamte Syntax überprüft, die C♯ benötigt (es ist sowieso ein unmöglicher Job für Regexes).

Verwandte Themen