2016-07-05 7 views
2

Ich habe den folgenden Code zu erzeugen, eine Eigenschaft erstellen:Wie struct basierte Eigenschaften mit Roslyn

Arten:

types = new Dictionary<string, SpecialType>(); 
types.Add("Guid", SpecialType.System_Object); 
types.Add("DateTime", SpecialType.System_DateTime); 
types.Add("String", SpecialType.System_String); 
types.Add("Int32", SpecialType.System_Int32); 
types.Add("Boolean", SpecialType.System_Boolean); 

generator.PropertyDeclaration(name, generator.TypeExpression(types["DateTime"]), Accessibility.Public); 

Allerdings habe ich immer eine Ausnahme erhalten, wenn der Name einer Strukturtyp ist die Parameter (zB Datetime oder Guid - für Guid, ich kann nicht einmal eine richtige besondere Art finden):

nicht unterstützt S pecialType

at: Microsoft.CodeAnalysis.CSharp.CodeGeneration.CSharpSyntaxGenerator.TypeExpression(SpecialType specialType) 
    at: MyProject.CreateProperty(String name, String type) 

Was soll ich verwenden?

+1

Nach [dieser] (http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/SpecialType.cs5b11a29d644330dc), gibt es nichts für 'Guid'. Ihre DateTime sieht jedoch gut aus – lokusking

+0

@lokusking Haben Sie einen Hinweis, warum sie einen *** sehr grundlegenden und gemeinsamen *** Datentyp wie 'Guid' ausgelassen haben? – Nestor

+1

@Nestor "Basic und Common" ist nicht das Gleiche wie "Special". Der Compiler betrachtet einen speziellen Typ nur dann, wenn es notwendig ist, da es Situationen gibt, in denen er diesen Typ auf besondere Weise behandeln muss. – svick

Antwort

3

Sie können Eigenschaften erstellen, basierend auf dem Namen des Typs, so könnten Sie Datetime und Guid Eigenschaften mit Code wie

// Create an auto-property 
var idProperty = 
    SyntaxFactory.PropertyDeclaration(
     SyntaxFactory.ParseTypeName("Guid"), 
     "Id" 
    ) 
    .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)) 
    .AddAccessorListAccessors(
     SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), 
     SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) 
    ); 

// Create a read-only property, using a backing field 
var createdAtProperty = 
    SyntaxFactory.PropertyDeclaration(
     SyntaxFactory.ParseTypeName("DateTime"), 
     "CreatedAt" 
    ) 
    .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)) 
    .AddAccessorListAccessors(
     SyntaxFactory.AccessorDeclaration(
      SyntaxKind.GetAccessorDeclaration, 
      SyntaxFactory.Block(
       SyntaxFactory.List(new[] { 
        SyntaxFactory.ReturnStatement(SyntaxFactory.IdentifierName("_createdAt")) 
       }) 
      ) 
     ) 
    ); 

erstellen Wenn ich etwas offensichtlich verpasst haben, das bedeutet, dass Sie nicht verwenden können, diese Art von Syntax, würden Sie bitte Ihre Antwort bearbeiten und eine ausführbare Minimum reproduzieren Fall?

(ich, dass die „PropertyDeclaration“ bemerkt Methode in der Sample-Parameter-Namen angibt, Typ, Zugänglichkeit, die zu irgendwelchen „PropertyDeclaration“ Methodensignaturen auf der SyntaxFactory Klasse nicht entsprechen - ist diese Methode ein, die Sie, dass geschrieben habe dann ruft eine SyntaxFactory-Methode auf?)

+0

Ich kann SyntaxFactory verwenden, aber das Ergebnis Ihres Beispiels ist das: 'Guid Id'. Kein Getter, kein Setter, aber ich habe vor, automatische Eigenschaften wie 'Guid Id {get; einstellen;} '. Kann ich es mit der Fabrik erreichen? Ihre andere Frage: Die Methode, die ich benutze, stammt aus dieser Klasse: 'generator = SyntaxGenerator.GetGenerator (workspace, LanguageNames.CSharp);' – Nestor

+0

Es gibt Methoden in der PropertyDeclarationSyntax -Instanz, die von PropertyDeclaration zurückgegeben werden, wie zB "AddModifiers" machen Sie die Eigenschaft zum Beispiel öffentlich) und "AddAccessorListAccessors" (damit Sie einen Getter und/oder Setter hinzufügen können). –

+0

Ich habe diesen Code verwendet, kein Setter oder Getter erschienen, sehr seltsam: http://pastebin.com/i0pg5qiD – Nestor