Automati c замена наследования композицией в Visual Studio - PullRequest
0 голосов
/ 06 февраля 2020

У меня вопрос о том, как автоматически заменить наследование композицией в Visual Studio (в настоящее время VS 2015).
Итак, у нас есть базовый класс Person с такими свойствами, как FirstName, LastName et c и несколько классы, которые наследуются от него, такие как User, Student et c .. Я пытался найти способ сделать это автоматически, используя встроенные инструменты Visual Studio и ReSharper, но не смог найти ни одного. Я знаю, что эти инструменты являются мощными и имеют много вариантов рефакторинга, но не смог найти решение для этого конкретного c требования. Можно ли сделать это с помощью этих инструментов или какого-либо другого подключаемого модуля VS?

Обновление,
Согласно комментариям, вот некоторый код:

Вот базовый класс Person:

/// <summary>
/// Base type for all types that represent a person in the system.
/// </summary>
[Table("Persons")]
public class Person : BaseEntity, IImportEntity
{
    public int ID { get; set; }

    [MaxLength(9)]
    public string PersonID { get; set; }

    [MaxLength(25)]
    public string PassportNumber { get; set; }

    [MaxLength(25)]
    public string TempIDNumber { get; set; }

    [MaxLength(30)]
    public string FirstName { get; set; }

    [MaxLength(30)]
    public string MiddleName { get; set; }

    [MaxLength(30)]
    public string LastName { get; set; }

    [MaxLength(30)]
    public string NickName { get; set; }

    // Additional properties, omitted...
}

Вот один класс, который наследуется от него, Student:

[Table("Students")]
public class Student : Person
{
    [MaxLength(30)]
    public string NickFamlyName { get; set; }

    public int? NationalCode { get; set; }

    public int? IdentityType { get; set; }

    public DateTime? LeavingDate { get; set; }

    public int? CodeEntitlementToTuition { get; set; }

    [Required]
    public int StudentTypeID { get; set; }

    public int? StudentCharacteristicTypeID { get; set; }

    // Additional properties, omitted...
}

Теперь вот требуемый результат:

[Table("Students")]
public class Student
{
    public Person PersonDetails { get; set; }  // Notice the containment of Person in this class

    [MaxLength(30)]
    public string NickFamlyName { get; set; }

    public int? NationalCode { get; set; }

    public int? IdentityType { get; set; }

    public DateTime? LeavingDate { get; set; }

    public int? CodeEntitlementToTuition { get; set; }

    [Required]
    public int StudentTypeID { get; set; }

    public int? StudentCharacteristicTypeID { get; set; }

    // Additional porperties, omitted
}

И инструмент рефакторинга должен внести это изменение, вставив класс Person в его наследники, а также обновить вызовы Student для делегирования вызовов свойствам Person через новое свойство PersonDetails, например:

var firstName = someStudent.PersonDetails.FirstName;

вместо:

var firstName = someStudent.FirstName;

Спасибо,
ashilon

...