2017-06-01 13 views
2

私はMSLinqToSQLGeneratorを使用してデータベースを反映する部分クラスを生成するプロジェクトに取り組んでいます。これは、テーブルやストアドプロシージャなどに反映される複数の部分クラスを持つ単一のファイル(Database.designer.cs)を生成します。C#で部分クラス用の個別ファイルを生成する

Database.designer.csファイルは、基本的にこれです:

namespace Name.Space 
{ 
    public partial class SomeClass1 
    { 
     // stuff 
    } 

    public partial class SomeClass2 
    { 
     // stuff 
    } 

    public partial class SomeClass3 
    { 
     // stuff 
    } 
} 

さて、プロジェクトの別の部分は、クラスから活字体ファイルを自動生成するVisual Studio用タイプライター拡張子を使用しています。さて、タイプライターは1つのファイルの原則に基づいて動作します。つまり、1つの.csファイル内の複数のクラスを別々の.tsファイルに分割することはできません(これは本質的に必要です)。

だから私は、次の操作を実行するためのT4テンプレートを使用して考える:

  1. Database.designer.csファイルの内容を読む
  2. (各クラスの新しいファイルを作成し、すべての部分クラス
  3. のリストを取得します。のみ次のコードを含む<class-name>.cs
namespace Name.Space 
{ 
    public partial class SomeClass1 
    { 
     // 
    } 
} 

そうすれば、タイプライターは個々の.csファイルを読み込み、適切な.tsファイルを生成することができます。

私が必要とするのは、Database.designer.csファイルを読み取り、各クラスを独自のファイルに出力するための特定のT4コードです。いつものように

(私はチュートリアルを試してみた、私はコード例を試したし、私が得たすべての頭痛の種と私のキャリアパスを変更するには、突然の願望だった...)

+0

それは2017なぜあなたはまだlinq-to-sqlを使用していますか? EFコードは、これをすでに最初に服用しています。 –

+0

それは共同プロジェクトなので、私の呼びかけではありません...私はすでにそれを近代的なものに変えようとしています。 –

+0

2016年12月28日現在、[paratial](https://github.com/frhagn/Typewriter/issues/127)をサポートするために継ぎ目があります。 –

答えて

1

、私はそれをovercomplicated。ターゲットの.csファイルをFileオブジェクトとして開き、行単位で読み込み、必要なクラス名を抽出するだけでした。これは私がオンラインで見つけたいくつかの投稿(私が覚えていない様々な情報源)とTangible T4 TemplateFileManagerV2.1.ttincludeのコンポーネントの組み合わせです。フィリップCordasが.tstファイル・ジェネレータでは、前述したように

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".cs" #> 
<#@ include file="TemplateFileManagerV2.1.ttinclude" #> 
<#@ Assembly Name="System.Core" #> 
<#@ Assembly Name="System.Windows.Forms" #> 
<#@ assembly name="EnvDTE" #> 
<#@ 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="EnvDTE" #> 
<# 
    string absolutePath = Host.ResolvePath("..\\Database.designer.cs"); 
    string[] contents = File.ReadAllLines(absolutePath); 

    List<string> selectedContent = new List<string>(); 
    string[] separators = new string[] { " " }; 

    foreach (var csFileRow in contents) 
    { 
     if (csFileRow.Contains("public partial class")) 
     { 
      var tmpSplit = csFileRow.Split(' '); 
      var tmpString = tmpSplit[3]; // public partial class <targetClassName> (4th member) 

      if (tmpString.Contains("Result")) // Example: SearchRolesResult 
      { 
       selectedContent.Add(tmpString); 
      } 
     } 
    } 

    var manager = TemplateFileManager.Create(this); 
#> 
<# 
    foreach (var classItem in selectedContent) 
    { 
     manager.StartNewFile(classItem + ".cs"); 
#> 
namespace Name.Space 
{ 
    public partial class <#= classItem #> 
    { 
    } 
} 

<# 
     manager.EndBlock(); 
    } 
    manager.Process(); 

#> 

はその後、私は次のように指定:

Template(Settings settings) 
{ 
    settings.PartialRenderingMode = PartialRenderingMode.Combined; 
} 

私は必要なすべてのプロパティを持つクラスを完了しました.TSファイルをもたらしました。

関連する問題