首页 > 解决方案 > 如何从 lambda 表达式中为 MemberAccessExpressionSyntax 从 SemanticModel 获取 TypeInfo?

问题描述

例如我有代码:

using System.Linq;

namespace MyNamespace
{
    class Person
    {
        public string Name { get; set; }
    }
    
    class Program
    {
        static void Main()
        {
            string name = new Person().Name; // SemanticModel.GetTypeInfo() returns string. It's OK.
            string[] names = new Person[] { new Person() }.Select(p => p.Name).ToArray(); // SemanticModel.GetTypeInfo() returns ErrorTypeSymbol.
                     names = new Person[] { new Person() }.Select(Person p => p.Name).ToArray(); // SemanticModel.GetTypeInfo() returns string. It's OK.
        }
    }
}

我想p.Name从 LINQ Select 扩展的 lambda 表达式中获取 TypeInfo。我在我的 Roslyn 分析器中写:

syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray();

我得到了:

[0] = {MemberAccessExpressionSyntax} new Person().Name
[1] = {MemberAccessExpressionSyntax} new Person[] { new Person() }.Select(p => p.Name).ToArray
[2] = {MemberAccessExpressionSyntax} new Person[] { new Person() }.Select
[3] = {MemberAccessExpressionSyntax} p.Name

然后我尝试获取第一个 TypeInfo MemberAccessExpressionSyntax new Person().Name

context.Compilation.GetSemanticModel(syntaxTree).GetTypeInfo(syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray()[0]).Type.Name

它返回String。没关系。

但是当我试图从 lambda 表达式中获取 MemberAccessExpression 类型时Select(p => p.Name)

context.Compilation.GetSemanticModel(syntaxTree).GetTypeInfo(syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray()[3]).Type.Name

它返回空字符串。

如何在没有显式类型声明的情况下从 lambda 表达式中为 MemberAccessExpressionSyntax 从 SemanticModel 获取 TypeInfo?

标签: c#roslyn

解决方案


推荐阅读