- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在解决方案中有 2 个测试项目。
第一个项目(“VDoc”)声明 VDocQuery 类型。
第二个项目(“VDocQueryTest”)调用 VDocQuery 构造函数。
我得到 2 个 VDocQuery 的 ITypeSymbol(每个项目一个),比较它,但得到错误的结果。
步骤:
1. 获取第一个 ITypeSymbol(从 VDoc 项目中使用 SemanticModel.LookupNamespacesAndTypes() 方法)。
2. 从 VDocQueryTest 项目中获取第二个 ITypeSymbol(来自 ObjectCreationExpressionSyntax.GetTypeInfo().Type)
3. 将其与 ITypeSymbol.Equals(ITypeSymbol) 进行比较。
我期待真实的结果,但得到了错误的结果。
问题:如何在一个解决方案中正确比较来自不同项目的 ITypeSymbol?
代码示例:
class Program
{
static void Main(string[] args)
{
string solutionPath = @"..\..\..\StaticAnalysis.sln";
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution solution = workspace.OpenSolutionAsync(solutionPath).Result;
var vdocProject = FindProjectByName("VDoc", solution);
SemanticModel semanticModel = vdocProject.Documents.First().GetSemanticModelAsync().Result;
var nsVDocQueryFunctionalTest = (INamespaceOrTypeSymbol)semanticModel.LookupNamespacesAndTypes(0, null, "VDocQueryFunctionalTest").First();
var tVDocQuery = (ITypeSymbol)semanticModel.LookupNamespacesAndTypes(0, nsVDocQueryFunctionalTest, "VDocQuery").First();
TypeInfo ti = GetFromVDocRef(solution);
bool result1 = ti.Type.Equals(tVDocQuery); // false, expected = true?
//these 2 lines added after Jason Malinowski answer
var sVDocQuerySource = SymbolFinder.FindSourceDefinitionAsync(ti.Type, solution).Result;
bool result2 = sVDocQuerySource.Equals(tVDocQuery); // false, expected = true?
//this line solved the problem, thanks to @Tamas
bool result3 = ti.Type.DeclaringSyntaxReferences.FirstOrDefault()?.Equals(tVDocQuery.DeclaringSyntaxReferences.FirstOrDefault()) ?? false;
}
private static TypeInfo GetFromVDocRef(Solution solution)
{
var vdocQueryTestProject = FindProjectByName("VDocQueryTest", solution);
var vdocQueryTestProjectSemanticModel = vdocQueryTestProject.Documents.First().GetSemanticModelAsync().Result;
var compilationUnit = (CompilationUnitSyntax)vdocQueryTestProject.Documents.First().GetSyntaxRootAsync().Result;
var ns = (NamespaceDeclarationSyntax)compilationUnit.Members[0];
var cls = (ClassDeclarationSyntax)ns.Members[0];
var method = (MethodDeclarationSyntax)cls.Members[0];
var stat = (ExpressionStatementSyntax)method.Body.Statements[0];
var newExpr = (ObjectCreationExpressionSyntax)stat.Expression;
var ti = vdocQueryTestProjectSemanticModel.GetTypeInfo(newExpr);
return ti;
}
static Project FindProjectByName(string projectName, Solution solution)
{
var project = solution.Projects.SingleOrDefault(p => p.Name == projectName);
return project;
}
}
VDocQuery.cs:
using System.Collections.Generic;
namespace VDocQueryFunctionalTest
{
public class VDocQuery
{
public VDocQuery()
{
}
public void AddFields(string docType, params string[] fields)
{
}
public List<VDoc> Execute()
{
return null;
}
}
}
VDocQueryUse.cs:
using VDocQueryFunctionalTest;
namespace VDocQueryTest
{
static class VDocQueryUse
{
public static void VDocQueryUseTest()
{
new VDocQuery();
}
}
}
最佳答案
我可以通过在两个项目中使用不同的目标框架来重现您的问题。为两个项目设置相同的目标框架,然后您的原始解决方案将找到匹配的类型。
如果您不能更改目标框架,那么您仍然可以比较ITypeSymbol.DeclaringSyntaxReferences
。
关于c# - 如何比较 Roslyn 中不同项目的类型符号 (ITypeSymbol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681473/
我有一个类型参数值的字典: ImmutableDictionary typeParameterValues; 我如何使用 ITypeSymbol 替换这些类型参数: 例如。 List -> List
今天与 Roslyn 合作时,我偶然发现了 StaticConstructors ITypeSymbol 的属性,声明为 ImmutableArray但据我所知,在 C# 和 VB 中最多只能有一个静
我正在尝试编写一个 Roslyn 分析器来检测在数组上调用 Enumerable.Count() 的用法。这是我的分析器中的相关代码: public override void Initialize(
我可以像这样使用SyntaxGenerator 生成Int32 类型的参数... var generator = SyntaxGenerator.GetGenerator(document); var
我正在编写一些测试,我需要获得一个 ITypeSymbol。这是我的做法: private async Task GetTypeSymbol(string file, TextSpan spa
我在解决方案中有 2 个测试项目。 第一个项目(“VDoc”)声明 VDocQuery 类型。 第二个项目(“VDocQueryTest”)调用 VDocQuery 构造函数。 我得到 2 个 VDo
我正在使用 Roslyn-CTP 进行一些试验。 目前我正在尝试将 var 替换为具体类型。 var i=1; 应该变成: int i=1; 找出推断的类型很容易。但是由于这部分发生在语义模型中,我得
我如何检查 ITypeSymbol实例指的是委托(delegate)类型(如 Action 或 Func )。 我想我可以检查基类型是否为 System.Delegate .这是这样做的正确方法还是有
我如何检查 ITypeSymbol实例指的是委托(delegate)类型(如 Action 或 Func )。 我想我可以检查基类型是否为 System.Delegate .这是这样做的正确方法还是有
我需要检查一个 ITypeSymbol 以查看它是否可序列化。 ITypeSymbol 上没有IsSerializable 属性,也没有我在 Compiler API 中知道的扩展方法可以执行此操作,
我试图可靠地比较 ITypeSymbol 的两个实例,在以下情况下可能是最简单和最直接的方法(我在一个更大的项目中遇到了这些问题,并试图尽可能地简化它可能): 我有一个 CSharpCompilati
我已经成功地从 SyntaxNode 接收到一个 ITypeSymbol,方法是: SemanticModel.GetTypeInfo(sytaxNode).ConvertedType 现在我想知道这
我是一名优秀的程序员,十分优秀!