gpt4 book ai didi

c# - 如何将 Microsoft.CodeAnalysis.ITypeSymbol 与 System.Type 进行比较

转载 作者:太空狗 更新时间:2023-10-30 00:14:05 25 4
gpt4 key购买 nike

我已经成功地从 SyntaxNode 接收到一个 ITypeSymbol,方法是:

SemanticModel.GetTypeInfo(sytaxNode).ConvertedType

现在我想知道这个 ITypeSymbol对应一个System.Type我的执行代码中存在的实例,例如 typeof(IEnumerable<int>)someObject.GetType() .

我试过了

typeInfo.ConvertedType.ToString() == type.ToString()

但是它们不使用相同的格式规则,例如像 IEnumerable<int> 这样的泛型

TypeInfo.ToString() == "System.Collections.Generic.IEnumerable<int>"

同时

typeof(IEnumerable<int>).ToString() == "System.Collections.Generic.IEnumerable`1[System.Int32]"

此外,我认为最好比较 AssemblyQualifiedNames 而不是仅比较命名空间和类型名称,以避免可能的名称冲突。

理想情况下,我希望能够在我的执行代码中获得实际的 System.Type 实例,该实例与我从语义模型中获得的 ITypeInfo 相对应(前提是所需的程序集已加载和/或可用)。这将允许检查该类型是否可从其他类型等分配。

最佳答案

您可以使用 Compilation.GetTypeByMetadataName() 获取类型名称的 INamedTypeSymbol

那么试试这个:

semanticModel.GetTypeInfo(sytaxNode).ConvertedType.Equals(
semanticModel.Compilation.GetTypeByMetadataName(typeof(WhateverType).FullName))

这不适用于封闭的泛型类型,对于那些你需要做更多的事情。例如:

var ienumerableType = semanticModel.Compilation.GetTypeByMetadataName("System.Collections.Generic.IEnumerable`1");
var intType = semanticModel.Compilation.GetTypeByMetadataName("System.Int32");
var type = ienumerableType.Construct(intType);

关于c# - 如何将 Microsoft.CodeAnalysis.ITypeSymbol 与 System.Type 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33965410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com