2016-09-12 5 views
0

私の共有.NETライブラリのenumを含むjavascriptファイルを生成しようとしています(私のWeb APIとクライアントは自動的に同期され、複数のコードは書き込まれません)。 私は.NETポストビルドイベントについて聞いたことがありますが、私たちがどうすればいいのか、どうすればいいのかはよくわかりません。.NETプロジェクトでJSONポストビルドを生成

提案がありますか?

+0

あなたはT4テンプレートを考えましたか? – sam

+0

私が試したことを達成する方法の例を挙げることができますか? – barbenezra

答えて

1

T4 templatesでコードを生成できます。

自分でT4テンプレートの操作を手助けするために、AutoT4Devart T4 editorをダウンロードすることをお勧めします。 AutoT4は、プロジェクトをビルドするたびにT4ファイルに関連付けられたコード生成ツールを自動的に実行します(実行するカスタムツールが 'TextTemplatingFileGenerator'であることを確認してください)。 Devart T4エディタは、T4構文のテキストの色とインテリセンスを提供します。 (visualStudioからツール→拡張機能と更新→オンラインで拡張機能をインストールしてください)

.NETのクラスから関連情報を抽出するには、リフレクションを使用できます。 は正しい形式の.jsファイルを出力します。

私はあなたに例を挙げます:私は、アプリケーションのレイヤー境界でいくつかのクラスの正確なコピーを持っている必要があります。あなたはあなたのjavascriptを生成することができます同じ原則に従い

<#@ template hostspecific="false" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ assembly Name="System.dll" #> 
<#@ assembly Name="System.Core.dll" #> 
<#@ assembly name="$(TargetDir)EntityFramework.dll" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Text" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="System.Data.Entity" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="System.Text.RegularExpressions" #> 
<#string _namespace ="DataTransferObjects";#> 

namespace <#=_namespace#> 
{ 
<# 
    var entityTypes = typeof(MyDbContext).GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) 
     .Where(property => property.PropertyType.IsGenericType && 
     property.PropertyType.GetGenericTypeDefinition().ToString().Contains("DbSet")) 
     .Select(property => property.PropertyType.GetGenericArguments().First()); 

    foreach(var entityType in entityTypes) 
    { 
     Write($"\tpublic class {entityType.Name}{Environment.NewLine}"); 
     Write("\t{"); 
     Write(Environment.NewLine); 

     var properties = entityType.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach(var property in properties) 
     { 
      var internalFormat = property.PropertyType.ToString(); 

      //assign special char to [] to preserve array notation 
      internalFormat = internalFormat.Replace("[]", "^"); 
      var typeString = Regex.Replace(internalFormat, @"`(\d)\[", "<") 
       .Replace(']', '>').Replace("^", "[]"); 

      typeString= typeString.Replace(entityType.Namespace+".",""); 
      Write($"\t\tpublic {typeString} {property.Name} {{get; set;}}{Environment.NewLine}");      
     } 

     Write("\t}" + Environment.NewLine + Environment.NewLine); 
    } 
#> 
} 

:特に、私はので、私は、エンティティを検索してのDTOを生成し、このT4テンプレートを書いたEntityFrameworkエンティティののDTOを持っている必要があります。 これが役立つことを願っています。

関連する問題