我有以下代码:
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中,您可以在下图中看到它。
我用来从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);
}
答案 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)