在使用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
我不会得到这个信息。
如何为刚才定义的源加载语义模型?
答案 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;
}
)。