2015-01-30 27 views
12

Roslyn ile bir kod analizcisi yazıyorum ve bir ExpressionSyntaxTask veya Task<T> tipinin olup olmadığını kontrol etmem gerekiyor.Roslyn analizöründe bir ifadenin türünü kontrol etmek için doğru yolu?

Şimdiye kadar bu var:

private static bool IsTask(ExpressionSyntax expression, SyntaxNodeAnalysisContext context) 
{ 
    var type = context.SemanticModel.GetTypeInfo(expression).Type; 
    if (type == null) 
     return false; 
    if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task"))) 
     return true; 
    if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1"))) 
     return true; 
    return false; 
} 

O Task için çalışır, ama ben her "seviyesini kontrol etmek zorunda çünkü değil Task<int> veya Task<string> için ... Ben adı ve ad alanı kontrol edebilir, ama bu pratik var "ad alanının.

Bunu yapmanın önerilen bir yolu var mı?

+0

Neredeyse aynı soruna sahiptim, ancak daha genel olarak: Bir İfadenin belirli bir türle eşleşip eşleşmediğini kontrol etme, bu sorudaki gibi değil. [Benim cevabımı gör] (http://stackoverflow.com/a/33994426/3568661) Burada tam kod örneği ile –

cevap

6

Türü is a generic type öğesinin olup olmadığını kontrol edin ve yapılandırılmamış jenerik türünü döndürmek için OriginalDefinition kullanın.

+1

Teşekkürler! Ben 'ITypeInfo' ben aslında bir 'INamedTypeSymbol' oldu, aslında 'IsGeneric' özelliği göremedim gerçeğini özledim. Ancak 'ConstructUnboundGenericType', 'Görev 'yerine' Task <>' işlevini verir, bu nedenle GetTypeFromMetadataName ile aldığım türle eşleşmez. Bunun yerine ['ConstructedFrom'] (http://source.roslyn.io/#Microsoft.CodeAnalysis/Symbols/INamedTypeSymbol.cs,2b034eb9d8cd5598) özelliğini kullanmak zorunda kaldım. –

+2

'OriginalDefinition' kullanın - bu, her durumda GetTypeByMetadataName ile eşleşecek türünü size verir. İç içe geçmiş genel veya genel yöntem durumlarda ConstructedFrom tam olarak ne istediğinizi değil. –

+0

@JasonMalinowski, teşekkürler! –