如何获取在 Roslyn 的 using 语句中声明的变量的类型
How to get the type of a variable declared in a using statement in Roslyn
我正在使用 Rolsyn,试图找到解决方案中的所有位置,在 ISession 对象上调用了 'Save' 方法。这是我目前的解决方案:
if (call.Expression.ToString().Contains("Save"))
{
var innerExpression = call.Expression as MemberAccessExpressionSyntax;
if (innerExpression != null)
{
if (model.GetTypeInfo(innerExpression.Expression).Type.Name.Equals("ISession"))
{
//Do some work.
}
}
}
这适用于正常情况。然而,ISession 对象是在 using 语句中声明的,如下例所示。 SemaniticModel 上的 GetTypeInfo 方法返回一个 'ErrorType ?'.
using (var session = SessionHelper.SessionFactory.OpenSession())
{
session.Save(entityObject);
}
有办法吗?我检查了 Visual Studio Syntax Visualiser 中的代码,类型信息在那里可用,这让我认为这是可能的。
当返回的类型是错误类型时,这是因为您的解决方案具有未解析的引用,因此无法找到该类型。您需要告诉 roslyn 将这些引用包含在解决方案中。
这是通过创建 MetadataReference 并将它们添加到项目来完成的:
伪代码:
MetadataReference assemblyReference = MetadataReference.CreateFromFile(@"c:\path\to\some.dll");
var solutionPath = @"c:\path\to\my.sln";
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
foreach (var project in solution.Projects)
{
var referencedProject = project.AddMetadataReference(assemblyReference);
var compilation = referencedProject.GetCompilationAsync().Result;
}
我正在使用 Rolsyn,试图找到解决方案中的所有位置,在 ISession 对象上调用了 'Save' 方法。这是我目前的解决方案:
if (call.Expression.ToString().Contains("Save"))
{
var innerExpression = call.Expression as MemberAccessExpressionSyntax;
if (innerExpression != null)
{
if (model.GetTypeInfo(innerExpression.Expression).Type.Name.Equals("ISession"))
{
//Do some work.
}
}
}
这适用于正常情况。然而,ISession 对象是在 using 语句中声明的,如下例所示。 SemaniticModel 上的 GetTypeInfo 方法返回一个 'ErrorType ?'.
using (var session = SessionHelper.SessionFactory.OpenSession())
{
session.Save(entityObject);
}
有办法吗?我检查了 Visual Studio Syntax Visualiser 中的代码,类型信息在那里可用,这让我认为这是可能的。
当返回的类型是错误类型时,这是因为您的解决方案具有未解析的引用,因此无法找到该类型。您需要告诉 roslyn 将这些引用包含在解决方案中。
这是通过创建 MetadataReference 并将它们添加到项目来完成的:
伪代码:
MetadataReference assemblyReference = MetadataReference.CreateFromFile(@"c:\path\to\some.dll");
var solutionPath = @"c:\path\to\my.sln";
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
foreach (var project in solution.Projects)
{
var referencedProject = project.AddMetadataReference(assemblyReference);
var compilation = referencedProject.GetCompilationAsync().Result;
}