У меня вопрос о том, как автоматически заменить наследование композицией в 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