Как автоматически сгенерировать свойства C# класса на основе другого класса? - PullRequest
0 голосов
/ 07 мая 2020

Итак, у меня есть класс, который для простоты я назову AnimalStats:

namespace Animals.Entities
{
    public class AnimalStats
    {
        public int Size { get; set; }
        public int Bite { get; set; }
        public int Cuteness { get; set; }
    }
}

Я хочу создать еще один класс с именем AnimalStatsModifier, который содержит свойства, которые отображаются из тех, что указаны в AnimalStats, например,

namespace Animals.Entities
{
    public class AnimalStatsModifier
    {
        public double Size { get; set; }
        public double Bite { get; set; }
        public double Cuteness { get; set; }
    }
}

Я хочу каким-то образом усилить эти отношения.

Первый метод, который я пробовал, - это игра с абстракцией и наследованием, но я не мог понять способ делать то, что я хочу (были бы признательны за совет по некоторому шаблону проектирования или принципу OOP).

Моя вторая попытка заключалась в использовании текстового шаблона T4 для создания класса AnimalStatsModifier в аналогично этому:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ 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" #>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Animals.Entities
{
<# var statsClass = typeof(AnimalStats); #>
    public class <#= statsClass.Name #>Modifier
    {
        <# foreach (var property in statsClass.GetProperties()) { #>
            public float <#= property.Name #> { get; set; }
        <# } #>
    }
}

Но код шаблона не смог найти класс AnimalStats, если я не добавил ссылку на сборку, например:

<#@ assembly name="$(SolutionDir)\Entities\bin\Debug\netcoreapp3.1\Animals.Entities.dll" #>

Однако для этого требуется, чтобы проектная dll была собрана до того, как класс можно будет найти, поэтому сборка завершится неудачно, если класс не был собран раньше, и существует своего рода неприятная циклическая зависимость.

Кто-нибудь получил любой совет о том, как Я должен приближаться к этому?

...