2016-04-08 6 views
4

Was ich versuche zu tun:Roslyn TypeDeclarationSyntax, MethodDeclarationSyntax, FieldDeclarationSyntax haben gemeinsame Eigenschaften, aber keine gemeinsame Basisklasse oder Schnittstelle

Ich schreibe einen Code roslyn Refactoring. Mein Ziel ist es, ein Kaliber zu bilden. Was ich also mache, ist im Grunde, dass ich das gesamte private Personal lösche und die nicht-privaten Mitarbeiter durch throw new NotImplementedException() ersetze.

Was ist mein Problem:

Alles funktioniert gut, aber ich mit vielen Code-Duplizierung wie folgt endete:

private static bool IsPrivate(TypeDeclarationSyntax type) 
    { 
     return type.Modifiers.Any(IsPrivateModifier); 
    } 

    private static bool IsPrivate(MethodDeclarationSyntax method) 
    { 
     return method.Modifiers.Any(IsPrivateModifier); 
    } 

    private static bool IsPrivate(FieldDeclarationSyntax field) 
    { 
     return field.Modifiers.Any(IsPrivateModifier); 
    } 

    private static bool IsPrivate(PropertyDeclarationSyntax property) 
    { 
     return property.Modifiers.Any(IsPrivateModifier); 
    } 

    private static bool IsPrivate(IndexerDeclarationSyntax property) 
    { 
     return property.Modifiers.Any(IsPrivateModifier); 
    } 

    private static bool IsPrivateModifier(SyntaxToken modifier) 
    { 
     return modifier.Kind() == SyntaxKind.PrivateKeyword; 
    } 

Der Grund dafür ist, dass ich eine Eigenschaft verwenden muß Members und es gibt keinen gemeinsamen Basistyp oder eine Schnittstelle für Syntaxklassen, die Members deklarieren. Ich habe das gleiche Problem mit Eigenschaft Body, die für alle diese gemeinsam ist, bu gibt es keine gemeinsame Basis oder gemeinsame Schnittstelle.

Fragen: Gibt es einen Grund, warum API-Design ist so, oder fehlt mir etwas? Gibt es irgendein Muster, wie ich Doppelungen in diesen und vielen anderen ähnlichen Fällen vermeiden kann?


aktualisieren ein Problem im roslyn Repo Erstellt: #10455

+1

Ich schlage vor, dass Sie diese Anforderung an [Roslyn Repo] (https://github.com/dotnet/roslyn/issues). Es gibt bereits ein ähnliches Problem für "Identifier" (https://github.com/dotnet/roslyn/issues/9908). – svick

Antwort

0

ich sie hoffen, dass beheben, aber Sie können

dynamic 

um es für den Moment.

Verwandte Themen