web-dev-qa-db-ja.com

既存のC#クラスからC#クラスを生成する方法

次のような簡単なPOCOクラスがあります。

public class Book
{
    public string BookId { get; set; }
    public string Name { get; set; }
    //etc...
}

これらすべてのクラスを取得して、viewmodelsと呼ばれる別のクラスを生成したいのですが、出力は次のようになります。

public class BookViewModel
{
    [HiddenInput(DisplayValue = false)]
    public string BookId { get; set; }

    [Required]
    public string Name { get; set; }
    //etc...
}

これは最も単純な例です。実際には、対応するエンティティを使用してデータベース操作ロジックを実装する特別なクラスも生成したいと思います。

しかし、どうすればいいですか?現在ASP.NET Coreを使用していますが、Net Coreにソリューションが存在しない場合は、ソリューションが存在する場所で使用し、結果をコピーして貼り付けます。

だから、私は他のクラスからC#クラスを生成したいのですが、どうすればいいですか?

9
Yurii N.

それがすべてであり、さまざまなアーティファクトを生成するための共通の単一の真の情報源を持つことが現実的でない/実現可能でない場合は、T4テンプレート機能が役立つことがあります。

たとえば、 "Dummy"が、たとえばDummy.csにある同じソリューションのモデルのクラスライブラリプロジェクトであるとします。

namespace Dummy
{
    public class Something
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }

    public class SomethingElse
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }
}

次に、ビューモデルクラスライブラリで、Visual Studioの

「追加>新しいアイテム...> Visual C#アイテム>テキストテンプレート」

「ViewModel.tt」に追加するには:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ Assembly name="System.Core" #>
<#@ Assembly name="$(SolutionDir)\Dummy\bin\Debug\Dummy.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="Dummy" #>
<#
  // choose a convenient "anchor type" from your model, e.g., a base class or enum type, etc
  var model = typeof(Dummy.Something).Assembly.GetTypes();
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DummyViewModels
{
<# foreach (var type in model) { #>
    public class <#= type.Name #>ViewModel
    {
<# foreach (var property in type.GetProperties()) { #>
        public <#= property.PropertyType.Name #> <#= property.Name #> { get; set; }
<# } #>
    }
<# } #>
}

(同じプロジェクトの) "ViewModel.tt"で "右クリック>カスタムツールの実行"を実行すると、次の "ViewModel.cs"が生成されます。

namespace DummyViewModels
{
    public class SomethingViewModel
    {
            public Int32 Id { get; set; }
            public String Name { get; set; }
    }

    public class SomethingElseViewModel
    {
            public Int32 Id { get; set; }
            public String Name { get; set; }
    }
}

'お役に立てれば。

10
YSharp