10

EnvDTE(命名規則に基づいて)T4を使用してインターフェイスをテンプレート化するために使用して、プロジェクト内のすべてのクラスを一覧表示する方法を作成する際に問題が発生しました。その方法を説明しているドキュメントはないようです。私は始めました:

<#@ 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));

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

これどうやってするの?プロジェクトのクラスが欲しいだけです。

4

2 に答える 2

12

T4 を使用しているので、具体的な T4 Editorを確認することをお勧めします。彼らのギャラリーには、再利用可能な無料のテンプレート「tangible 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 を含めることができます。しかし、この方法の方が読みやすいです。

于 2013-01-18T15:50:51.680 に答える
0

T4テンプレートについてはよくわかりませんがReflection、1つで使用してクラスのテンプレートを取得できますか

例えば:

<#@ 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);
于 2013-01-15T21:18:36.163 に答える