2013-01-15 8 views
9

T4(名前付け規則に基づく)を使用するテンプレートインターフェイス用にEnvDTEを使用してプロジェクト内のすべてのクラスをリストする方法を作成する際に問題があります。それを行う方法を記述しているようです。私は始めました:EnvDTEを使用してプロジェクト内のユーザークラスのリストを収集します

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ Assembly name="EnvDTE" #> 
<#@ Assembly name="System.Core" #> 
<#@ import namespace="EnvDTE" #> 
<#@ Import Namespace="System.Linq" #> 
<#@ Import Namespace="System.Collections.Generic" #> 
<# 
    var env = (DTE)((IServiceProvider)this.Host) 
     .GetService(typeof(EnvDTE.DTE)); 

...そして私は横向きに出発しました。私は自分のプロジェクトを特定することができますが、私は、インターフェイスを作成するためのフラットなリストにフィルタリングしたいクラスをプロジェクトで収集することができません。

どうすればいいですか?私は自分のプロジェクトでクラスをしたいだけです。

+0

私はこれがVisual Studioであると仮定しています。もしそうなら、あなたはRoslynをまったく見たことがありますか? – Ameen

+2

ここで私の答えを見てくださいhttp://stackoverflow.com/a/6572941/157224 DTE – adrianm

+0

@adrianmでクラスを見つけることについては、これは私が探しているかもしれないように見える(一度私はC#に翻訳する)...私は朝にこれを試してみる。 –

答えて

10

あなたはT4を使用している私はあなたがチェックアウトすることをお勧めので、 tangible T4 Editor。彼らのギャラリーには、無料で再利用可能なテンプレートの「具体的なVisual Studio Automation Helper」があります。このテンプレートを使うとコードクラスなどを簡単に見つけることができます(この記事への私の答えはDesign Time Reflection参照)。

自分でそれをしたい場合は、次のように続けるべきである:私は必要となる再帰を削除

var project = env.ActiveDocument.ProjectItem.ContainingProject; 
foreach(EnvDTE.CodeElement element in project.CodeModel.CodeElements) 
{ 
    if (element.Kind == EnvDTE.vsCMElement.vsCMElementClass) 
    { 
     var myClass = (EnvDTE.CodeClass)element; 
     // do stuff with that class here 
    } 
} 

。 CodeElementは他のCodeElementを含むことができます。しかし、この方法で読むのは簡単です。

0

私はT4テンプレートについて多くを知らないが、あなたのクラスの

例:取得するには1でReflectionを使用することができます。

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ Assembly name="EnvDTE" #> 
<#@ Assembly name="System.Core" #> 
<#@ import namespace="EnvDTE" #> 
<#@ Import Namespace="System.Linq" #> 
<#@ Import Namespace="System.Collections.Generic" #> 
<#@ Import Namespace="System.Reflection" #> 
<# 

    var list = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsClass); 
+0

残念なことに、反射は、自己反映しようとすると、うんざりしてしまいます。データをキャッシュし、コードを変更しても必ずしも更新されるわけではありません。 –

+0

それはT4のテンプレートの中にあります。beacuse私はその前にその問題を見たことがありません –

+0

かなりええ。 –

関連する問題