来自 Roslyn 语义模型的 GetTypeInfo 无法找到“var”的类型

pin*_*ker 0 c# roslyn

我有以下代码:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在 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);
}
Run Code Online (Sandbox Code Playgroud)

m0s*_*0sa 5

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

var typeSymbol =
    ((ILocalSymbol)semanticModel.GetDeclaredSymbol(variable.Variables[0])).Type;
Run Code Online (Sandbox Code Playgroud)

你得到ITypeSymbol的将usaful部分TypeInfo

或者,您可以从 中获得更具体ITypeSymbol的信息VariableDeclaratorSyntax.Initializer,即 之后的部分var query =

var typeSymbol =
    semanticModel.GetOperation(variable.Variables[0].Initializer.Value).Type;
Run Code Online (Sandbox Code Playgroud)