我有以下代码:
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)
您需要获取query变量的语义信息,而不是声明的var(TypeSyntax您从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)