Как добавить универсальное свойство другого класса<T & gt; внутри существующего класса< T>
Не совсем уверен, как объяснить это в одной строчке, но вот моя ситуация.
У меня есть абстрактный базовый класс под названием "Deal", который имеет свойство в нем, которое относится к классу " Inventory"
Теперь сделка может быть либо наличной, финансовой, арендной, оптовой или арендной, поэтому она относится к типу сделки. Он также абстрактен, поскольку каждый из типов сделок имеет некоторые свойства, которые не применяются к другим, но все они имеют набор общих свойств, поэтому различные типы сделок (например, финансы, аренда и т. д.) наследуются от базового класса Deal и имеют свои собственные добавленные методы и свойства.
То же самое относится и к другому абстрактному классу "инвентаря". Инвентарь может быть таким, как автомобиль, грузовик, лодка, фургон и т. д.), Поэтому у меня есть класс инвентаря.
Вот в чем проблема:
Сделка должна содержать единицу в запасе. Например, вы финансируете автомобиль или арендуете фургон, а затем заключаете сделку с инвентарным имуществом типа инвентаря или каким-либо другим случаем.
Когда я создаю класс Deal и добавляю к нему свойство типа SoldUnit as Type Inventory, T наследуется от класса Deal. Как я могу создать универсальное свойство типа Inventory внутри класса Deal?
Deal на самом деле не будет работать из-за большого количества возможностей, так как же я могу создать универсальное свойство "SoldUnit", которое ссылается на класс инвентаря внутри класса Deal? А при сохранении строгой типизации? Я знаю, что мог бы создать свойство SoldUnit с типом object или dynamic, но есть ли лучший способ?
Вот выдержка из кода: он не работает, потому что тип T уже является DealType, но это два свойства [ ret.Vehicle = new Car(); и ret.SoldUnit = new Car ();], которые я пытаюсь заполнить определенным типом инвентаря (автомобиль, грузовик, rv, лодка и т. д.) В методе Get (). Конкретный тип запасов определяется флагом в поле база данных.
public abstract class Deal<T> { public string Uid { get; set; } = Guid.NewGuid().ToString(); public DealTypes DealType { get; set; } = DealTypes.Finance; public Buyer Customer { get; set; } public Inventory<T> Vehicle { get; set; } public Location Location { get; set; } public Inventory<T> SoldUnit { get; set; } public abstract T Add(string id); public abstract T Update(string id); public abstract T Get(string id); } public abstract class Inventory<T> { public string Uid { get; internal set; } = Guid.NewGuid().ToString(); public Location Location { get; set; } public string StockNumber { get; set; } = ""; } public class Cash : Deal<Cash> { public decimal TradeAllowance { get; set; } public decimal TradePayoff { get; set; } public decimal TotalDown { get; set; } public decimal DueOnDelivery { get; set; } public override Cash Get(string id) { var ret = new Cash(); ret.Customer = new Buyer(); ret.Vehicle = new Car(); ret.Location = new Location(); ret.SoldUnit = new Car(); } } public class Car : Inventory<Car> { public decimal GrossWeight { get; set; } public decimal NetWeight { get; set; } public string Branded { get; set; } = ""; public string FuelType { get; set; } = ""; public string Trim { get; set; } = ""; public string Body { get; set; } = ""; public int Cylinders { get; set; } public decimal EngineSize { get; set; } public string TransmissionType { get; set; } = ""; public string Suspension { get; set; } = ""; public string InteriorColor { get; set; } = ""; public bool OdometerExceedsLimit { get; set; } public bool OdometerTrueMileageUnknown { get; set; } public bool OdometerFiveDigit { get; set; } public string TitleNumber { get; set; } = ""; public DateTime? TitleDate { get; set; } public string TitleState { get; set; } = ""; public DateTime? TitleDue { get; set; } public DateTime? TitleReceived { get; set; } }
Есть ли способ сделать это?
Спасибо!
Что я уже пробовал:
Я пробовал сделать класс Deal с двумя типами
public class Deal<TDeal, TInventory>но тогда мне пришлось бы сделать класс для каждой возможной комбинации типа сделки / инвентаря. До сих пор единственное, что я могу придумать, чтобы это сработало, - это сделать свойства Vehicle и SoldUnit типа object или dynamic, но тогда я не получаю строгой типизации или intellisense.
public dynamic Vehicle { get; set; }
public object SoldUnit{ get; set; }
Nick4978
В двух словах, это та часть, которую я пытаюсь заставить работать:
public abstract class Deal<T> { public Inventory<AnyVehicleType> Vehicle { get; set; } public Inventory<AnyVehicleType> SoldUnit { get; set; } }
AnyVehicleType
это просто psuedo-код здесь, но будет свойством типа Inventory
(автомобиль, грузовик, лодка и т. д.) внутри класса сделок, которые могут быть такими вещами, как финансы, аренда, Оптовая торговля и т. д.
Richard Deeming
Зачем нужен параметр универсального типа на Inventory
класс? Не похоже, чтобы использоваться где угодно.
Если есть является причина, чтобы иметь его, не могли бы вы создать не универсальный базовый класс?
public abstract class Inventory { public string Uid { get; internal set; } = Guid.NewGuid().ToString(); public Location Location { get; set; } public string StockNumber { get; set; } = ""; } public abstract class Inventory<T> : Inventory { }