11

タイプ名が与えられた場合、DTE を使用してそのタイプが配置されている ProjectItem を見つけることは可能ですか? Navigate To...ダイアログが Visual Studio 2010 でどのように機能するかに似ています。

私が見つけることができる最も近いものは ですがSolution.FindProjectItem、それはファイル名を取ります。

ありがとう!

4

1 に答える 1

9

私は似たようなことをしようとしてきましたが、探しているものにヒットするまで名前空間とクラスを単純に検索する次のことを思いつきました。

ほとんどの場合は機能するようですが、部分クラスに遭遇すると最初のヒットのみが返され、ファイルのモデルであるため、そのファイルに含まれるメンバーのみが含まれます。それについてどうするかはまだ考え中です。

これは T4 テンプレートから取得され、T4 ツールキット (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;
}
于 2010-06-07T15:29:50.093 に答える