У меня есть сторонняя библиотека, которую я использую. Они предоставили мне некоторые классы, которые я могу использовать для переноса данных с одной страницы на другую, но у меня нет исходного кода для внесения изменений, например.
public class Customer
{
public string Name {get;set}
public Additional AdditionalDetails {get;set}
}
В этом примере я хочу расширить класс Additional
и добавить к нему свойства, не нарушая существующую работу.
Мой контроллер и представление работают, передавая класс customer
, но все, что я хочу сделать, это добавить новое свойство в класс Additional
.
Я попытался создать частичный класс, но это не сработало, и я получил предупреждение о частичном классе с одной частью.
Затем я попытался создать класс как
public class Additional
в том же пространстве имен в моем проекте и добавьте новое свойство, но это тоже не сработало (свойство не показывалось).
Есть ли способ расширить этот Additional
класс, не нарушая существующий код?
В отличие от этого, вместо расширения класса «Дополнительно» вы можете создать новый класс, который содержит экземпляр «Дополнительно» и добавляет новые необходимые вам свойства. Метод расширения или оболочка могут справиться с этим.
Вы можете создать новый класс, содержащий экземпляр дополнительного класса и добавляющий необходимые вам дополнительные свойства. Таким образом, вы избегаете прямого изменения существующего класса.
public class AdditionalExtended
{
public Additional AdditionalDetails { get; set; }
public string NewProperty { get; set; }
}
Затем обновите класс Customer, чтобы использовать класс ExtraExtended:
public class Customer
{
public string Name { get; set; }
public AdditionalExtended AdditionalDetailsExtended { get; set; }
}
Вам потребуется обновить код, чтобы использовать свойство ExtraDetailsExtended вместо свойства ExtraDetails.
Я пытался избежать этого, поскольку это сломало бы существующий код.
Один из способов сделать это — использовать методы расширения или класс-оболочку для добавления дополнительных функций, сохраняя при этом существующую структуру.
У вас есть пример? Обратите внимание, что существующий сторонний класс не может быть изменен при использовании.
Использование методов расширения public static class ExtraExtensions {private static readonly Dictionary<Additional, string> extraProperties = new Dictionary<Additional, string>(); public static void SetNewProperty (это дополнительное дополнительное, строковое значение) { extraProperties [дополнительное] = значение; } Публичная статическая строка GetNewProperty (это дополнительное дополнительное) { return extraProperties.TryGetValue (дополнительное, выходное значение var)? значение: ноль; } }
Есть ли способ расширить этот дополнительный класс, не нарушая существующий код?
Чтобы расширить Additional class
и добавить к нему свойства, не нарушая существующую работу, мы могли бы воспользоваться несколькими подходами, одним из способов может быть Wrapper Class
Этот подход позволяет вам продолжать использовать существующий сторонний класс (Клиент и Дополнительный) без каких-либо изменений в их использовании при добавлении новых свойств в Дополнительный.
Прежде всего, я бы создал клиента с существующими деталями, затем мне нужно было бы обернуть дополнительные детали, куда можно было бы включить новое свойство, и, наконец, построить модель представления для передачи данных в представление.
Давайте посмотрим на практике:
Существующий класс:
public class Additional
{
public string ExistingProperty { get; set; }
}
public class Customer
{
public string Name { get; set; }
public Additional AdditionalDetails { get; set; }
}
public interface IAdditional
{
string ExistingProperty { get; }
}
Класс оболочки:
public class ExtendedAdditional : IAdditional
{
private readonly Additional _original;
public ExtendedAdditional(Additional original)
{
_original = original ?? throw new ArgumentNullException(nameof(original));
}
public string ExistingProperty => _original.ExistingProperty;
public string NewProperty { get; set; }
}
Посмотреть модель:
public class CustomerViewModel
{
public Customer Customer { get; set; }
public ExtendedAdditional ExtendedAdditional { get; set; }
}
Контроллер:
public IActionResult Index()
{
var customer = new Customer
{
Name = "Kiron Test",
AdditionalDetails = new Additional { ExistingProperty = "Existing Value" }
};
var extendedAdditional = new ExtendedAdditional(customer.AdditionalDetails)
{
NewProperty = "New Value"
};
var model = new CustomerViewModel
{
Customer = customer,
ExtendedAdditional = extendedAdditional
};
return View(model);
}
Вид:
@model CustomerViewModel
<h2>Customer Details</h2>
<p>Name: @Model.Customer.Name</p>
<h3>Additional Details</h3>
<p>Existing Property: @Model.ExtendedAdditional.ExistingProperty</p>
<p>New Property: @Model.ExtendedAdditional.NewProperty</p>
Выход:
Примечание. В большинстве случаев использование класса-оболочки (ExtendedAdditional) считается более элегантным и лучше соответствует принципам объектно-ориентированного проектирования и разделения задач. Он обеспечивает четкую границу между логикой вашего приложения и реализацией сторонней библиотеки.
На момент написания это все еще находится в предварительной версии, но в C# 13 у вас будет новая функция под названием «Расширения», которая позволит вам расширять любой класс даже от сторонних производителей.
Итак, вы можете сделать следующее:
public implicit extension AdditionalExtention for Additional
{
//Extend property example
public string FullName { get => $"{this.Firstname} {this.Surname}"; }
//Simple example of extension method getting an approximate age
public int GetAge(this Additional additional)
{
return DateTime.Today.Year - this.DateOfBirth.Year;
}
}
Затем вы просто используете свой класс как обычно.
var age = customer.GetAge();
var fullname = customer.Fullname;
Ник Чапсас объясняет эту функцию гораздо лучше меня в своем видео. https://thewikihow.com/video_ueO5Cb3Emcw
Если класс
Additional
не запечатан, вы можете создать производный класс, наследуемый от дополнительного, и добавить новые необходимые вам свойства.