我正在使用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
?
或者:我如何在返回的继承者集合中搜索具有我开始的类的类型作为泛型类型参数?
答案 0 :(得分:1)
啊,这是有道理的。 ITypeElement
是IDeclaredElement
的实例,这意味着它具有声明 - 例如类或接口声明。因此,当您获得代表已关闭通用的IType
时,它由表示通用类型(ITypeElement
)的ICommandHandler
和表示已解析通用的ISubstitution
组成类型参数(AnotherCommand
)。当你调用IType.GetTypeElement()
时,它将返回type元素/替换对的type元素部分,这是开放的泛型声明元素(因为接口声明只能打开)。
我认为您可能必须采用替代方法,并找到ITypeHandler<T>
的所有继承者(实现者)并在消费者中过滤掉它们。传递给使用者的FindResult
可以向下转换为FindResultInheritedElement
,这将为您提供一个声明的元素,该元素表示实现ITypeHandler<T>
的类。您应该能够遍历这些元素的接口以查看它们实现的内容,并且只接受那些实现正确T
的查找结果。我认为TypeElementUtil
将有助于获取声明元素的所有超类型(基类型+接口)。