【问题标题】:GetTypeInfo from semantic model in Roslyn fails to find type of "var"来自 Roslyn 语义模型的 GetTypeInfo 无法找到“var”的类型
【发布时间】:2016-08-24 03:52:36
【问题描述】:

我有以下代码:

public class ParallelLinqAsSequential
{
    private List<Customer> _orders;

    private void Method()
    {
        var query = (_orders.AsParallel().OrderBy(ord => ord.CustomerID).Select(ord => new
        {
            Date = ord.OrderDate
        })).AsSequential().Take(5);
    }

    private class Customer
    {
        public string CustomerID;
        public DateTime OrderDate { get; set; }
    }
}

我期待当通过名为“query”的变量调用语义模型时,它能够将其推断为具有“DateTime”类型字段的匿名类型的 Enumerable。但它失败并显示ErrorType。

在 Visual Studio 中,您可以看到它,如下图所示。

我用来从 Roslyn 获取这个的代码是:

public void GetType(SyntaxTree tree)
{
            var Mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
            var compilation = CSharpCompilation.Create("RoslynVar", syntaxTrees: new[] { tree }, references: new[] { Mscorlib });


            VariableDeclarationSyntax variable = ... // get the relevant variable
            TypeInfo symbolInfo = semanticModel.GetTypeInfo(variable.Type);
}

【问题讨论】:

  • 你能显示用于执行此操作的代码吗?
  • 检查语义模型的诊断。也许您缺少对 System.Core 的引用

标签: c# roslyn


【解决方案1】:

您需要获取query 变量的语义信息,而不是var query 声明的var(您从variable.Type 获得的TypeSyntax)部分。在您的情况下,这将是:

var typeSymbol =
    ((ILocalSymbol)semanticModel.GetDeclaredSymbol(variable.Variables[0])).Type;

您会得到ITypeSymbol,它是TypeInfo 的有用部分。

或者,您可以从VariableDeclaratorSyntax.Initializer 获得更具体的ITypeSymbol,这是var query = 之后的部分:

var typeSymbol =
    semanticModel.GetOperation(variable.Variables[0].Initializer.Value).Type;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2017-03-06
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多