2016-08-29 1 views
1

Je veux écrire un analyseur de code Roslyn; qui doit fonctionner si ObjectCreationExpression crée un objet à partir d'une classe locale (soit dans le projet en cours, soit dans un projet de la solution actuelle); ou si la classe provient d'un autre endroit, comme la bibliothèque de classes de base ou un paquet Nuget, etc.En utilisant Roslyn, comment vérifier si la classe provient d'un projet local, pas le BCL ou le Nuget (etc)?

Comment puis-je savoir d'où vient une classe à Roslyn?

Répondre

5

Vous ne pouvez obtenir cela qu'à l'aide du modèle sémantique. Vous pouvez obtenir le symbole pour le constructeur et le contrôle où le type vient via Locations or DeclaringSyntaxReferences, .: par exemple

// ObjectCreationExpression node == ...; 
// SemanticModel model = ...; 
var symbol = model.GetSymbolInfo(node).Symbol; // the constructor symbol 
var type = symbol.ContainingType; // the class symbol 
var isFromSource = type.DeclaringSyntaxReferences.Length > 0 
+0

Vouliez-vous dire .ContainingType pour la deuxième ligne de code? –

+0

@JasonMalinowski en effet, merci – m0sa