如何在 ReSharper 插件中创建一个代表封闭泛型类型的“ITypeElement”?

Posted

技术标签:

【中文标题】如何在 ReSharper 插件中创建一个代表封闭泛型类型的“ITypeElement”?【英文标题】:How do I create a `ITypeElement` with represents a closed generic type in a ReSharper plugin? 【发布时间】:2015-06-25 07:49:18 【问题描述】:

我正在使用 ReSharper 8 sdk,并且想要查找特定泛型接口的所有继承者,其中泛型类型是特定类型。我有asked a more general question,它大部分都在那里,但我只能找到ICommandHandler<T> 的任何实现,而不是我想要的一个实现,ICommandHandler<TestCommand>

这是我的代码:

foreach (var psiModule in declaredElement.GetPsiServices().Modules.GetModules())

    IDeclaredType genericType = TypeFactory.CreateTypeByCLRName("HandlerNavigationTest.ICommandHandler`1", psiModule, theClass.ResolveContext);
    var genericTypeElement = genericType.GetTypeElement();
    if (genericTypeElement != null)
                        
        var theType = TypeFactory.CreateType(originalTypeElement);
        var commandHandlerType = TypeFactory.CreateType(genericTypeElement,theType);
        var handlerTypeelement = commandHandlerType.GetTypeElement();
        solution.GetPsiServices().Finder.FindInheritors(handlerTypeelement, searchDomainFactory.CreateSearchDomain(solution, true),
        inheritorsConsumer, NullProgressIndicator.Instance);
        var inheritedInstance= inheritorsConsumer.FoundElements.First();
        var sourceFile = inheritedInstance.GetSourceFiles().First();
    
  

如果我在此行之后提示 commandHandlerType:

var commandHandlerType = TypeFactory.CreateType(genericTypeElement,theType);

我看到类型指定正确:

但是当我从这种类型中获得ITypeElement 并使用此行传递到我的搜索中时

var handlerTypeelement = commandHandlerType.GetTypeElement();

我好像丢了类型:

所以我的搜索找到了ICommandHandler<T> 的所有实现。

所以我的问题是,如何创建代表我要搜索的封闭泛型类型的ITypeElement

或者:如何在返回的继承者集合中搜索以我开始使用的类作为泛型类型参数的类型?

【问题讨论】:

【参考方案1】:

啊,有道理。 ITypeElementIDeclaredElement 的一个实例,这意味着它具有声明——例如类或接口声明。因此,当您获得一个代表您的封闭泛型的IType 时,它由一个代表泛型类型(ICommandHandler)的ITypeElement 和一个代表解析的泛型类型参数(AnotherCommand)的ISubstitution 组成。当您调用IType.GetTypeElement() 时,它将返回类型元素/替换对的类型元素部分,即开放的泛型声明元素(因为接口声明只能是开放的)。

我认为您可能必须采取替代方法,并找到ITypeHandler<T> 的所有继承者(实现者)并在消费者中过滤它们。传递给消费者的FindResult 可以向下转换为FindResultInheritedElement,这将为您提供一个声明的元素,该元素表示实现ITypeHandler<T> 的类。您应该能够遍历这些元素的接口以查看它们实现了什么,并且只接受那些实现正确T 的查找结果。我认为TypeElementUtil 将在这里帮助获取已声明元素的所有超类型(基类型+接口)。

【讨论】:

因为我之前已经创建了泛型类型,所以我可以使用GetAllSuperTypes() 方法,然后检查每个返回的类型,看看它是否是我感兴趣的泛型类型,如果是那么我可以导航到它。所以现在我必须全力以赴。只需要使命令/处理程序类型可以从配置中读取,然后它应该足够灵活以普遍有用。 感谢所有帮助。非常感谢。 好的,所以another blocker,如果你能把我推向正确的方向,请...

以上是关于如何在 ReSharper 插件中创建一个代表封闭泛型类型的“ITypeElement”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用mockito在安卓系统中创建模拟api响应[关闭]。

如何在 Java 静态块中创建本地类? [复制]

VS安装了ReSharper后,TAB建不好用,有人能教教吗

如何在 WordPress 插件安装中创建 MySql 用户自定义函数?

如何在Eclipse插件中创建xhtml文件?

如何在 Buildfire 中创建共享链接