来自Roslyn中语义模型的GetTypeInfo无法找到" var"

时间:2016-08-18 07:08:42

标签: 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; }
    }
}

我期待在名为&#34; query&#34;的变量上调用语义模型时它可以将它推断为一个匿名类型的Enumerable,其字段为&#34; DateTime&#34;类型。但它失败并显示ErrorType。

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

enter image description here

我用来从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);
}

1 个答案:

答案 0 :(得分:3)

您需要获取query变量的语义信息,而不是var声明TypeSyntax variable.Type var query部分var typeSymbol = ((ILocalSymbol)semanticModel.GetDeclaredSymbol(variable.Variables[0])).Type; 声明。在你的情况下,这将是:

ITypeSymbol

您获得了TypeInfo的美国部分的ITypeSymbol

或者,您可以从VariableDeclaratorSyntax.Initializer获取更具体的var query =var typeSymbol = semanticModel.GetOperation(variable.Variables[0].Initializer.Value).Type; 之后的部分:

def my_transform(x, y):
    return (x+y/2, y)