c# - 如何从 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?
解决方案
推荐阅读
- java - 强制类为 Tomcat 会话复制实现 Serializable
- java - 不允许运行 keytool 时是否可以添加 SSL 证书?
- excel - VBA:从 XFA 表单中提取 XML 数据并传递给 XML 解析器
- php - 如何在网站上显示存储在 MySQL 数据库表中的网站链接,但显示为要点击的超链接?
- python - Python webscraping如何只获取body html
- php - 如果字符串中已经存在逗号,则数组内爆到 MySql,然后检索值并爆炸回相同的数组不起作用
- python - 解析文件时的进度条
- python - 使用 pandas 数据框生成 GEOJSON
- outlook - Microsoft Outlook 365 支持哪些颜色名称?
- node.js - NPM 安装失败并带有私有仓库