【问题标题】:How to get Type instance from IType (Resharper 8 SDK)如何从 IType (Resharper 8 SDK) 获取 Type 实例
【发布时间】: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
   }
}

【问题讨论】:

    标签: c# resharper-sdk


    【解决方案1】:

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

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

    【讨论】:

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