本文整理汇总了C#中ConstructorInitializerSyntax.FirstAncestorOrSelf方法的典型用法代码示例。如果您正苦于以下问题:C# ConstructorInitializerSyntax.FirstAncestorOrSelf方法的具体用法?C# ConstructorInitializerSyntax.FirstAncestorOrSelf怎么用?C# ConstructorInitializerSyntax.FirstAncestorOrSelf使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConstructorInitializerSyntax
的用法示例。
在下文中一共展示了ConstructorInitializerSyntax.FirstAncestorOrSelf方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: PropagateConstructorParams
private async Task<Document> PropagateConstructorParams(
Document document,
ConstructorInitializerSyntax constructorInitializerNode,
ImmutableArray<IParameterSymbol> baseConstrParams,
CancellationToken cancellationToken)
{
var semanticModel = await document.GetSemanticModelAsync();
var classDecl = constructorInitializerNode.FirstAncestorOrSelf<ClassDeclarationSyntax>();
var classSymbol = semanticModel.GetDeclaredSymbol(classDecl);
var constructorDecl = constructorInitializerNode.FirstAncestorOrSelf<ConstructorDeclarationSyntax>();
var constructorSymbol = classSymbol.Constructors
.Where(p => p.Parameters.Count() == constructorDecl.ParameterList.Parameters.Count)
.FirstOrDefault();
var invArgList = constructorInitializerNode.ArgumentList;
var declParamList = constructorDecl.ParameterList;
int idx = -1;
foreach(var baseP in baseConstrParams)
{
idx++;
if (constructorSymbol.Parameters.Any(p => p.Type.Name == baseP.Type.Name))
continue;
declParamList = declParamList.AddParameters(
SyntaxFactory.Parameter(
SyntaxFactory.Identifier(baseP.Name))
.WithType(
SyntaxFactory.IdentifierName(baseP.Type.Name)));
invArgList = SyntaxFactory.ArgumentList(invArgList.Arguments.Insert(idx, SyntaxFactory.Argument(SyntaxFactory.IdentifierName(baseP.Name))));
}
var root = await document.GetSyntaxRootAsync();
var newConstructor = constructorDecl.WithParameterList(declParamList)
.WithInitializer(constructorInitializerNode.WithArgumentList(invArgList));
root = root.ReplaceNode(constructorDecl, newConstructor);
return document.WithSyntaxRoot(root);
}