2017-08-14 22 views
3

我正在寫一個Roslyn診斷分析器。在我註冊任何其他操作之前,我想告訴System.Collections.Immutable是否在RegisterCompilationStartAction中被引用。這是我到目前爲止的方式:Roslyn:如何判斷某個特定程序集是否在編譯中被引用?

context.RegisterCompilationStartAction(compilationStartContext => 
{ 
    var compilation = compilationStartContext.Compilation; 
    if (compilation.GetTypeByMetadataName("System.Collections.Immutable.ImmutableArray`1") == null) 
    { 
     return; 
    } 

    ... 
}); 

這可行,但我不覺得這是最乾淨的方式來做到這一點。我可以以某種方式獲得對應於程序集名稱的MetadataReference,並檢查它是否爲空,如GetMetadataReference("System.Collections.Immutable") == null? (GetMetadataReference不接受一個字符串,所以這實際上不起作用。)如果沒有,其他更清潔的方式來做到這一點,不涉及挑選特定類型?謝謝。

回答

0

而不是搜索,你可以簡單地通過參照搜索和解決MetadataReference檢查特定的程序集是否包含項目中的類型:

if(!compilation.References.Any(reference => 
     compilation.GetAssemblyOrModuleSymbol(reference) 
     .Name == "System.Collections.Immutable")) 
{ 
    return; 
} 
相關問題