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
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