1

我正在使用 ReSharper 8 sdk 并希望找到特定泛型接口的所有继承者,其中泛型类型是特定类型。我已经问了一个更一般的问题,它已经解决了大部分问题,但我只能找到任何实现,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代表我要搜索的封闭泛型类型的?

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

4

1 回答 1

1

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

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

于 2015-06-26T11:44:15.853 回答