Modo per generare classi C # dalla classe C # esistente

5

Ho delle classi POCO semplici, come questa:

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

Voglio ottenere tutte quelle classi e generare altre classi, che chiamano viewmodels, ad esempio, l'output sarebbe:

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

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

Questo è l'esempio più semplice, nella vita reale vorrei anche generare classi speciali, che implementano la logica delle operazioni di database con le entità corrispondenti.

Tuttavia, come dovrei farlo? In questo momento sto usando ASP.NET Core, ma se la soluzione non esiste in Net Core, la userò solo dove esiste e il risultato di copia-incolla.

Quindi, voglio generare classi C # da altre classi, come devo fare questo?

    
posta Yurii N. 05.10.2016 - 17:58
fonte

1 risposta

5

Se questo è tutto ciò che hai e non è pratico / fattibile avere un'unica fonte di verità comune per generare i tuoi diversi artefatti, potresti trovare utile la funzione di template T4.

Ad esempio, supponiamo che "Dummy" sia il progetto della libreria di classi del tuo modello nella stessa soluzione, con, diciamo, in 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; }
    }
}

Quindi, nella tua libreria di classi del modello di visualizzazione, puoi utilizzare

di Visual Studio

"Aggiungi > Nuovo elemento ... > Elementi Visual C # > Modello di testo"

da aggiungere, in "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; }
<# } #>
    }
<# } #>
}

che dovrebbe produrre, dopo "fare clic con il tasto destro > Esegui strumento personalizzato" sul "ViewModel.tt" (nello stesso progetto), il seguente "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; }
    }
}

'Spero che questo aiuti.

    
risposta data 06.10.2016 - 01:19
fonte

Leggi altre domande sui tag