Чтобы получить тип члена, вам необходимо его решить, используя семантическую модель.
Для следующего фрагмента кода я предполагаю, что у вас есть документ или может иным образом получить SyntaxTree и SemanticModel:
public static async Task GetNameFromDocument(Document document)
{
var syntaxTree = await document.GetSyntaxTreeAsync();
var semanticModel = await document.GetSemanticModelAsync();
var root = syntaxTree.GetRoot();
MemberAccessExpressionSyntax member = GetMemberAccessExpressionSyntax(root);
if (member != null)
{
var firstChild = member.ChildNodes().ElementAt(0);
var typeInfo = semanticModel.GetTypeInfo(firstChild).Type as INamedTypeSymbol;
var typeName = typeInfo.Name;
}
}
public static MemberAccessExpressionSyntax GetMemberAccessExpressionSyntax(SyntaxNode node)
{
return node.DescendantNodes().Where(curr => curr is MemberAccessExpressionSyntax)
.ToList().FirstOrDefault() as MemberAccessExpressionSyntax;
}
Вы использовать SyntaxTree, чтобы найти ваше выражение - как вы считаете нужным (у вас есть для замены GetMemberAccessExpressionSyntax) - и впоследствии может использовать семантическую модель для разрешения типа MemberAccessExpression.
Первый ребенок MemberAccessExpressionSyntax всегда должен быть доступным элементом, чтобы вы могли взять узел и получить его тип, используя семантическую модель. Предоставленный тип - это acutal тип, а не псевдоним - typeName будет соответствовать DateTime
Спасибо, он выглядит точно, что я был после, я буду тестировать его позже; это повлияет на работу моего автономного анализатора? (Учитывая, что теперь ему также понадобится семантический анализ, а не только синтаксический анализ). –
Я не испытывал проблем с производительностью после извлечения семантической модели. Кажется, он работает довольно быстро, однако я никогда не тестировал этот тип кода для скорости. – SJP
SemanticModels работают медленнее, но если вам нужно их использовать, используйте их. Вот для чего они! Люди слишком часто тяготеют к нашей синтаксической модели и пишут ошибки в этом процессе. :-) –