2016-06-24 9 views
-2

Update: Grund dafür, brauche ich komplexe Objekte erstellen, tief verschachtelt wie Dokument Objektmodelle. Ich kann nicht sagen, ob alle Eigenschaften initialisiert worden sind, wirklich, um zu sehen, ob ich eine Eigenschaft vermisste, besonders wenn sie tief verschachtelt sind.Generieren von Code für Eigenschaftsinitialisierer aus einem Objekt InitializerExpressionSyntax

Mit anderen Worten, ich muss sehen, ob der komplette Objektbaum initialisiert wurde oder ich irgendwo eine Eigenschaft verpasst habe.

Können wir Roslyn verwenden, um das Objekt InitializerExpressionSyntax nur aus Code zu generieren? Versuchen Sie nicht, das Objekt wie in diesem Beitrag zu dekompilieren: Can Roslyn generate source code from an object instance?

Würde es mit komplexen/verschachtelten Objekten funktionieren?

+2

Was meinst du damit, * irgendetwas * mit Roslyn von einer "Instanz" eines Objekts zu machen? Roslyn ist ein kompilierbarer Apparat - eine "Instanz" von etwas ist das Gegenteil. –

+0

@KirkWoll: Also sagen wir an einer Stelle eine Objektinstanz mit einer Menge von Werten, woanders wird eine andere Instanz mit einer anderen Menge von Werten, beide im Code, erstellt. Sie möchten lediglich alle möglichen Instanzerstellungswerte im gesamten Code sammeln, nicht zur Laufzeit. – Arjang

+1

Ah, OK, dann ja, Roslyn ist dafür völlig geeignet. (und Sie sollten Ihre Frage wirklich bearbeiten, um klar zu machen, dass Sie über 'ObjectCreationExpressionSyntax' /' InitializerExpressionSyntax' und nicht eine tatsächliche Laufzeit-Instanz sprechen). Die Antwort auf Ihre Frage lautet "Ja", aber jetzt ist es auch so breit. Sie müssen herausfinden, in welchem ​​inkrementellen Problem Sie stecken bleiben. Wenn die Lösung A → B → C → D lautet: Sie haben uns gefragt, wie Sie von A nach D gehen können. Sie müssen die kleine Arbeitseinheit A → B finden, an der Sie tatsächlich feststecken. –

Antwort

0

Schreiben Sie ein Programm oder verwenden Sie die T4-Vorlage, um Codes aus Codes zu generieren.

var code = @"public partial class Abc { public string AAA { get; set; } }"; 
var syntaxTree = CSharpSyntaxTree.ParseText(code); 
var syntax = (CompilationUnitSyntax)syntaxTree.GetRoot(); 

var @class = syntax.ChildNodes().OfType<ClassDeclarationSyntax>().First(); 
var properties = @class.ChildNodes().OfType<PropertyDeclarationSyntax>(); 
foreach (var property in properties) 
{ 
    ... 
}