다음은 캐시 사용에 대한 설명입니다. 여전히 옳은 것처럼 보이지는 않지만 이전 방법보다 더 나을 것으로 기대합니다. 이것은 여전히 GeneratorProvider.Populate
에서 호출 :
public static IEnumerable<ICSharpTypeDeclaration> GetAllPublicTypeDeclarations(this IPsiModule module)
{
var declarationCache = module.GetPsiServices().CacheManager.GetDeclarationsCache(module, false, true);
var declarations = new List<ICSharpTypeDeclaration>();
foreach (var shortName in declarationCache.GetAllShortNames())
{
var declaredElements = declarationCache.GetElementsByShortName(shortName).OfType<ITypeElement>().Where(e =>
{
var elementType = e.GetElementType();
return elementType == CLRDeclaredElementType.CLASS || elementType == CLRDeclaredElementType.INTERFACE || elementType == CLRDeclaredElementType.ENUM;
});
foreach (ITypeElement declaredElement in declaredElements)
{
var declaration = declaredElement.GetDeclarations().OfType<ICSharpTypeDeclaration>().FirstOrDefault(d => d.GetAccessRights() == AccessRights.PUBLIC);
if (declaration != null)
{
declarations.Add(declaration);
}
}
}
return declarations;
}
참고 : 결과는 첫 번째 대답과 동일하지 않습니다, 나는 몇 가지 제한 사항을 변경 한 원인. 또한 두 경우 모두 부분 클래스에 관심이 없습니다.
이것은 물론 제거 된 버전이며 모든 점검과 추가 조건 및 변환이 간결하게 제거되었습니다. – mbinic
이것은 매우 느릴 것이며, 프로젝트가 커질수록 모든 파일을 처리하게됩니다. 더 이상 사용할 7.1이 없지만 ReSharper의 [캐시] (https://confluence.jetbrains.com/display/NETCOM/4.01+Caches+%28R7%29)에서이 정보를 얻을 수 있어야합니다. – citizenmatt
감사합니다. 귀하의 의견을 위해 Matt! 캐시는 내가 처음 보았지만 짧은 이름으로는별로 도움이되지 않았다. 디버깅 세션에서 2 cs 파일 만있는 프로젝트의 경우 8000+ 개 항목을 보았다. 대부분의 이름은 수업이 아닌 참조 된 어셈블리에서 가져온 것이므로 점점 더 느려졌습니다. 어쨌든, 한번 시도해 보겠습니다. – mbinic