私の共有.NETライブラリのenumを含むjavascriptファイルを生成しようとしています(私のWeb APIとクライアントは自動的に同期され、複数のコードは書き込まれません)。 私は.NETポストビルドイベントについて聞いたことがありますが、私たちがどうすればいいのか、どうすればいいのかはよくわかりません。.NETプロジェクトでJSONポストビルドを生成
提案がありますか?
私の共有.NETライブラリのenumを含むjavascriptファイルを生成しようとしています(私のWeb APIとクライアントは自動的に同期され、複数のコードは書き込まれません)。 私は.NETポストビルドイベントについて聞いたことがありますが、私たちがどうすればいいのか、どうすればいいのかはよくわかりません。.NETプロジェクトでJSONポストビルドを生成
提案がありますか?
T4 templatesでコードを生成できます。
自分でT4テンプレートの操作を手助けするために、AutoT4
とDevart 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を持っている必要があります。 これが役立つことを願っています。
あなたはT4テンプレートを考えましたか? – sam
私が試したことを達成する方法の例を挙げることができますか? – barbenezra