无法从INamedTypeSymbol中获取Type的内部成员

时间:2018-01-24 03:10:36

标签: roslyn roslyn-code-analysis

我通过使用Compilation.GetTypeByMetadataName(...)方法从Roslyn编译中获取引用类型。然后我使用INamedTypeSymbol.GetMembers()方法获取其所有成员符号。我得到所有公共和受保护的符号,但既不是私人也不是内部。我不太关心私人会员符号,但内部对我来说是必须的。有没有办法从Roslyn汇编中获取它们?

1 个答案:

答案 0 :(得分:1)

似乎我解决了这个问题,但并非没有黑客攻击。

必须将编译的隐藏属性MetadataImportOptions设置为MetadataImportOptions.All(即2)。 CSharpCompilationOptions.MetadataImportOptions成员和MetadataImportOptions枚举都是Microsort.CodeAnalysis程序集的内部。我不得不使用反射来设置它。特别是我 做了类似的事情:

    MethodInfo withMetadataImportOptionsMethodInfo = 
      typeof(CSharpCompilationOptions).GetMethod("WithMetadataImportOptions, BindingFlags.NonPublic | BindingFlags.Instance);

    MyCompilationOptions = 
        (CSharpCompilationOptions) withMetadataImportOptionsMethodInfo.Invoke(MyCompilationOptions, (byte) 2);

(byte)2是MetadataImportOptions.All选项。