私はVisual Studio 2015のプラグインを開発しようとしています。プロジェクトを右クリックして右クリックしたときにコンテキストメニューに追加されるコマンドがあります。今私がしようとしているのは、プロジェクトに特定のインタフェースを実装するクラスが含まれているかどうかを判断することです。だから私の最初のステップは、プロジェクトのクラスを取得することです。だから私は次のようなことをしました:CodeElementがプロジェクトに属しているかどうかを確認
protected IEnumerable<EnvDTE.CodeClass> GetClasses(EnvDTE.CodeElements elements,
EnvDTE.Project project)
{
foreach (EnvDTE.CodeElement element in elements)
{
System.Diagnostics.Debug.WriteLine(element.InfoLocation);
var cls = element as EnvDTE.CodeClass;
if (cls != null)
{
yield return cls;
}
var ns = element as EnvDTE.CodeNamespace;
if (ns != null)
{
foreach (var childCls in GetClasses(ns.Members, project))
{
yield return childCls;
}
}
}
}
これは、クラスを通過して引き出します。問題は、参照されるすべてのものにBCLクラスが含まれていることです。私はInfoLocation
を使用すると助けになると思いましたが、すべてがvsCMInfoLocationExternal
を返します(おそらく、プラグインが実行されているコンテキストでは、外部にあるためです)。私はelement.ProjectItem
とelement.ProjectItem.ContainingProject
とelement.Parent
のようなものを親プロジェクトと比較することを望んで試しましたが、それらはすべてSystem.Runtime.InteropServices.COMException
を投げます。プロジェクトを知っているので、特定のCodeElement
がプロジェクトの一部であるのか、それともプロジェクトによって参照されているのかを判断する方法はありますか?
EDIT:最高のは、私がこれまでに出てくることができましたが、これを行うことです、最初のプロジェクトのデフォルトの名前空間を取得:
var defaultNS = project.Properties.Item("DefaultNamespace").Value.ToString();
をそして私はこれを行うことができます。
をif (ns != null && ns.Name == defaultNS)
ここでは、私はSystem
にドリルダウンしません。これは良いことです。唯一の問題は、プロジェクトに複数の名前空間があり、検索したい場合です。プロジェクト内にと定義されている名前空間のリストを取得する方法があるかどうかはわかりません。
編集:提案された二重引用符はType
を扱うので、完全には関連しません。
私はhttp://stackoverflow.com/questions/3174921/how-do-i-determine-if-system-type-is-a-custome-type-orのDUPとしてこれをマーキングしています-a-framework-typeを使用することはできません。なぜなら、これをvs拡張モジュールの内部または外部で行う方法がないからです。 –
@PaulSwetz:それを行う方法はないかもしれませんが、提案されたデュプリは同じものではなく、ここでは役立ちません。私は 'Type'を持っていない、' CodeElement'を持っているので、 'Type'を含む提案は関係ありません。 –
ソリューション定義の外部参照と比較してコード要素内で見つかるどのようなクラス/ enum/structsかを調べることで、あなたが望むことを実行できるという答えを出すことができます。 *あなたのニーズに合っているかもしれませんが、非常に効率的だとは言えませんが、再帰性が高いからです。 –