如何从 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消失了