如何从 IType (Resharper 8 SDK) 获取 Type 实例

Posted

技术标签:

【中文标题】如何从 IType (Resharper 8 SDK) 获取 Type 实例【英文标题】:How to get Type instance from IType (Resharper 8 SDK) 【发布时间】:2015-11-24 12:07:04 【问题描述】:

我正在尝试编写我的第一个 ReSharper 扩展程序,但遇到以下问题:

如何从它的 IType 描述符中获取已解析的类型?

作为背景,我正在尝试编写一个分析器,该分析器使用一个工具来测试两种类型参数的兼容性。

到目前为止,我已经得到了这个

[ElementProblemAnalyzer(new[]  typeof(IInvocationExpression) )]
public class MyAnalyzer : IElementProblemAnalyzer`

   public void Run(ITreeNode element, ElementProblemAnalyzerData analyzerData, IHighlightingConsumer consumer)
   
        ...

        var typeArgs = meaningfulChildren.FirstOrDefault(o => o is ITypeArgumentList) as ITypeArgumentList;

        IType psiType = typeArgs.TypeArguments[0];
        Type actualType = psiType.ResolvedType; // No such property
   

【问题讨论】:

【参考方案1】:

您不能按照您的要求去做 - ReSharper 的类型系统是项目源的视图,而不是加载到 AppDomain 中的程序集。换句话说,即使 Foo.cs 尚未加载,您也可以获得在 Foo.cs 中定义的类的IType。如果项目无法编译,它仍然需要能够返回类型信息,因为 Bar.cs 中的代码完全无效。

因此,如果不编译项目并将程序集加载到 AppDomain 中,就无法将 IType 转换为 System.Type。但是 ReSharper 有很多工具可以在它自己的类型系统视图中处理类型。你到底想做什么?

【讨论】:

我担心可能是这种情况。我正在尝试为 AutoMapper 构建一个 ReSharper 扩展,目的是如果它确定您正在映射的类型不是完全“可映射”的,它会提供一个突出显示。为此,我需要使用对 Mapper.CreateMap<TSource, TDest>() 的调用以及实际类型。 如果您可以轻松地复制逻辑,您将能够使用 ReSharper 编写它 - 有多种实用方法可以检查两种类型(基于源代码)是否兼容。跨度> 可悲地兼容在这里并不是微不足道的——这不仅仅是常规意义上的可赋值,它是“目标类型上的所有属性是否都可以从源类型或其任何子类型中‘水合’如果您将它们展平,则属性”。我查了一下,不幸的是他们也没有在 .Net 类型系统之上添加抽象层,所以我不能轻易伪造它。它最终可能会带来更多的麻烦而不是它的价值。不过,我很感谢你的建议。

以上是关于如何从 IType (Resharper 8 SDK) 获取 Type 实例的主要内容,如果未能解决你的问题,请参考以下文章

Resharper 8 - Quickfix快捷键Alt + Enter消失了

Resharper 8:导航到反编译源不起作用

如何声明具有相同主体的 2 个接口?

如何使用 Resharper SDK 从 IClrDeclaredElement 获取 IDeclaredType

ReSharper 8.2.1 不工作

resharper 8.1