1

コアのエンティティに基づいてビュー モデルを生成する T4 テンプレートに取り組んでいます。たとえば、コアに News クラスがあり、このテンプレートにこれらのようなビューモデルを生成させたい

public class News
{
    public property int Id {get;set;}
    public property string Title {get;set;}
    public property string Content {get;set;}
}

public class NewsCreate
{
    public property int Id {get;set;}
    public property string Title {get;set;}
    public property string Content {get;set;}
}
public class NewsUpdate
{
    public property int Id {get;set;}
    public property string Title {get;set;}
    public property string Content {get;set;}
} 

今のところこの2つだけです。News クラスのプロパティを取得する方法が見つかりませんでした。リフレクションを使用してそれらを取得するにはどうすればよいですか。. .

4

1 に答える 1

2

ビューを作成したいのと同じプロジェクト内に「ニュース」クラスがあると仮定すると、次の 2 つの可能性があります。

  1. プロジェクトをビルドし、 を使用して T4 テンプレートで出力アセンブリを参照します <#@ assembly name="$(TargetPath)" #>。次に、テンプレート内で標準のリフレクションを使用して、目的のクラスに到達できます。ただし、古いビルドやエラーが含まれている可能性がある最後のビルドを常に反映していることに注意してください。
  2. tangible の T4 エディタを見てください。これは無料で、構文の強調表示と T4 テンプレート用の IntelliSense を提供します。また、「具体的な VisualStudio Automation Helper」という名前のテンプレートを含む無料のテンプレート ギャラリーもあります。これをテンプレートに含め、Visual Studio コード モデルを使用して、現在のソリューション内にあるすべてのクラスを反復処理します。

    <# var project = VisualStudioHelper.CurrentProject;
    
    // get all class items from the code model
    var allClasses = VisualStudioHelper.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false);
    
    // iterate all classes
    foreach(EnvDTE.CodeClass codeClass in allClasses)
    {
        // iterate all properties
        var allProperties = VisualStudioHelper.GetAllCodeElementsOfType(codeClass.Members, EnvDTE.vsCMElement.vsCMElementProperty, true);
        foreach(EnvDTE.CodeProperty property in allProperties)
        {
            // check if it is decorated with an "Input"-Attribute
            if (property.Attributes.OfType<EnvDTE.CodeAttribute>().Any(a => a.FullName == "Input"))
            {
                ...
            }
        }
    }
    #>
    

それが役立つことを願っています!

于 2013-07-08T12:20:15.613 に答える