Я пытался сделать что-то подобное, и придумал следующее, которое просто просматривает пространства имен и классы, пока не достигнет того, которое вы ищете.
Кажется, что это работает в большинстве случаев, хотя при обнаружении частичного класса он будет возвращать только первое попадание, и, поскольку он является моделью файла, он будет содержать только элементы, содержащиеся в этом файле. Все еще выясняю, что с этим делать.
Это происходит из шаблона T4 и использует T4 Toolkit (откуда и происходит TransformationContext), поэтому, если вы его не используете, просто возьмите элемент проекта и передайте Project.CodeModel.CodeElements в рекурсивный FindClass способ.
Примером использования будет FindClass ("MyCompany.DataClass");
private CodeClass FindClass(string className)
{
return FindClass(TransformationContext.Project.CodeModel.CodeElements, className);
}
private CodeClass FindClass(CodeElements elements, string className)
{
foreach (CodeElement element in elements)
{
if(element is CodeNamespace || element is CodeClass)
{
CodeClass c = element as CodeClass;
if (c != null && c.Access == vsCMAccess.vsCMAccessPublic)
{
if(c.FullName == className)
return c;
CodeClass subClass = FindClass(c.Members, className);
if(subClass!= null)
return subClass;
}
CodeNamespace ns = element as CodeNamespace;
if(ns != null)
{
CodeClass cc = FindClass(ns.Members, className);
if(cc != null)
return cc;
}
}
}
return null;
}