InitializerExpressionSyntax
.
var initializer = node.Ancestors().OfType<InitializerExpressionSyntax>.FirstOrDefault();
要知道任何特定代码是否是属性设置器的赋值,您需要做更多的工作。你需要询问
SemanticModel
对于分配给
AssignmentExpressionSyntax
语义模型
和
SyntaxTree
从其参数/上下文。
SemanticModel model = ...;
AssignmentExpressionSyntax assignment = ...; // find the assignment
var symbol = model.GetSymbolInfo(assignment).Symbol as IMethodSymbol;
if (symbol?.MethodKind == MethodKind.PropertySet) { ... }
ObjectCreationExpressionSyntax
应该是
初始化表达式语法
一旦您有了创建节点,您可以询问
语义模型
再一次使用
GetTypeInfo
方法获取表达式的类型(正在构造的类型/符号)而不是构造函数的符号。
var creation = initializer.Ancestors().OfType<ObjectCreationSyntax>().FirstOrDefault();
var createdType = model.GetTypeInfo(creation).Type as INamedTypeSymbol;
现在,您只需要知道类型是否实现了接口。
首先,您需要一个符号作为接口类型。一种快速的方法是使用其CLR元数据名称进行查找。
var interfaceType = model.Compilation.GetTypeByMetadataName("MyNamspace.MyInterfaceType");
现在,您已经拥有了需要发现正在构造的类型是否实现了接口的所有内容。
if (createdType.AllInterfaces.Contains(interfaceType)) { ... }