Yup. DataFlowAnalysis
API'sini kullanabilirsiniz.
var tree = CSharpSyntaxTree.ParseText(
@"
class C{
void M(){
var x = ""foo"";
var a = new string[0];
var testing = a.Any(i => i == x);
}
}
");
var Mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);
var lambda = tree.GetRoot().DescendantNodes().OfType<LocalDeclarationStatementSyntax>().Last();
var dataFlowAnalysis = model.AnalyzeDataFlow(lambda);
var capturedVariables = dataFlowAnalysis.Captured;
foreach(var variable in capturedVariables)
{
//Do something
}
fazla 'bir serbest/çekilen değişken olması halinde x' bazı kapak sınıfının bir alan olacaktır. – leppie
[RoslynClrHeapAllocationAnalyzer] 'a bir göz atın (https://github.com/mjsabby/RoslynClrHeapAllocationAnalyzer). Bellek ayırmalarını ve kapanışları analiz eder. –
@YuvalItzchakov bağlantı için teşekkürler, ben şimdi "SemanticModel" dan alabildiğim 'DataFlowAnalysis 'nesnesinin' Yakalanan 'özelliği kontrol etmek gerekiyor açık olduğunu açık. – Seldon