Roslyn TypeDeclarationSyntax、MethodDeclarationSyntax、FieldDeclarationSyntax 具有共同的属性,但没有共同的基础 class 或接口

Roslyn TypeDeclarationSyntax, MethodDeclarationSyntax, FieldDeclarationSyntax have common properties but no common base class or interface

我想做什么:

我正在使用 roslyn 编写代码重构。我的目标是创造一个课程。所以我所做的基本上是删除所有私人员工并用 throw new NotImplementedException().

替换非私人员工的身体

我的问题是什么:

一切正常,但我最终遇到了很多代码重复,如下所示:

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

原因是我需要使用 属性 Members 并且没有用于声明 Members 的语法 类 的通用基类型或接口。我对 属性 Body 有同样的问题,这对所有这些都是共同的,但没有共同的基础或共同的接口。

问题: 为什么 API 设计是这样的,或者我错过了什么?在这些和许多其他类似情况下,有什么模式可以避免重复。


更新 在 roslyn 存储库中创建了一个问题:#10455

我希望他们能解决这个问题,但你可以

dynamic 

暂时绕过它。