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
暂时绕过它。
我想做什么:
我正在使用 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
暂时绕过它。