如何从Roslyn中的源代码获取语义模型

时间:2016-11-24 07:56:07

标签: c# .net roslyn

在使用Roslyn的所有示例中,您都有类似的内容:

SyntaxTree tree = CSharpSyntaxTree.ParseText(
@"using System;
using System.Collections.Generic;
using System.Text;

namespace HelloWorld
{
    // A whole program here...
}");

var root = (CompilationUnitSyntax)tree.GetRoot();

// Getting the semantic model (for MSCORELIB)
var compilation = CSharpCompilation.Create("HelloWorld")
                  .AddReferences(
                     MetadataReference.CreateFromFile(
                       typeof(object).Assembly.Location))
                  .AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);

如何获取代码的语义模型?

最后一段代码检索mscorelib类型的语义模型:MetadataReference.CreateFromFile(typeof(object).Assembly.Location),以便我可以检查using或源的其他部分并获取符号信息。

但是如果我在HelloWorld中定义类型并想从那些中检索符号信息,我会使用语义模型。但是因为我刚加载mscorelib我不会得到这个信息。

如何为刚才定义的源加载语义模型?

1 个答案:

答案 0 :(得分:6)

HelloWorld

这是你需要的吗? mscorlib是我在blah中定义的类型,我可以获得信息。

只是解释一下,语义模型是你可以从编译中获得的东西。编译完成后,您可以从此编译中获取所有信息。不只是来自添加的参考(在您的情况下为#include <vector> template<typename A, typename B, typename C> class blah { public: // Put stuff here. void AddToVectorA(A item); void AddToVectorB(B item); void AddToVectorC(C item); private: std::vector<A> _a; std::vector<B> _b; std::vector<C> _c; }; template<typename A, typename B, typename C> void blah<A,B,C>::AddToVectorA(A item) { _a.push_back(item); } template<typename A, typename B, typename C> void blah<A,B,C>::AddToVectorB(B item) { _b.push_back(item); } template<typename A, typename B, typename C> void blah<A,B,C>::AddToVectorC(C item) { _c.push_back(item); } int main() { blah<int, double, float> b; b.AddToVectorA(2); return 0; } )。