Czy to rozsądne rozwiązanie?

0

Mam klasę A, która ma swoją strukturę, wygenerowaną automatycznie. Niestety, ale klasa może występować w dwóch wersjach o tym decyduje wartość jednego z boola, każda z wersji ma swoje prawidłowe wartości pól. W jaki stworzyć dwie dodatkowe klasy, aby ograniczyć ich wypełnianie tylko do tych zgodnych w danym typie.
Np. jeżeli klasa A ma pole string kod, to dla wersji drugiej to pole może mieć wartości zdefiniowane w liście C = [22,53,43]

Zrobiłbym dwie klasy, które całkowicie przejmują kontrolę nad tworzeniem klasy A, która na końcu zwróciłaby obiekt A readonly, skoro nie mogę przykryć pół, tylko kompozycje i wystawić odpowiednie 'setery', które będą zawierać logikę.
Klasa A będzie w przyszłości serializowana do xml i testowana schematornami.

1

Mam klasę A, która ma swoją strukturę, wygenerowaną automatycznie

ok

Niestety, ale klasa może występować w dwóch wersjach o tym decyduje wartość jednego z boola

no to Factory Pattern. Zaden bool, jezeli juz jest jakies rozwarstwienie, to klasa A powinna byc rozdzielona na A i B jako ze jest to model z tego co zrozumialem z posta

Zrobiłbym dwie klasy, które całkowicie przejmują kontrolę nad tworzeniem klasy A,

Jedna klasa ktora przejmuje kontrole nad tworzeniem albo A albo B. A i B moze miec wspolny interfejs (czy tam klase bazowa)

obiekt A readonly

niemutowalnosc, jest zupelnie czyms innym. Oczywiscie ze tak zrob, ale to nie ma nic wspolnego z tematem / problemem

jest pytanie jeszcze jakich frameworkow uzywasz, bo kazdy troszke inaczej wspiera dziedziczenienie np dla Newtonsoft.Json (czyli jsona)

    [JsonConverter(typeof(JsonSubtypes), "$type")]
    [JsonSubtypes.KnownSubType(typeof(B), "b")]
    [JsonSubtypes.KnownSubType(typeof(C), "c")]
    public abstract class A
    {
        [JsonProperty(PropertyName = "$type")]
        public abstract string JsonType { get; }
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

    public class B: A
    {
        public override string JsonType => "b";

        public Guid SomethingNew { get; set; }
    }
0

@fasadin: Tak jest zdefiniowany format invoice peppol.eu, Dzieki za pomoc anyway.
The element cac:AllowanceCharge with sub element cbc:ChargeIndicator indicates whether the instance is a charge (true) or an allowance (false).

<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
    <!-- Code omitted for clarity -->
        <cac:AllowanceCharge>
            <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
            <cbc:AllowanceChargeReason>Insurance</cbc:AllowanceChargeReason>
1

wiec obierasz jakiegos XMLa i na podstawie tego masz albo A albo B

wiec masz ExternalModel i na podstawie tego tworzysz swoj InternalModel

Wtedy mozesz miec wszystko co chcesz (nawet z tym co przedstawilem). Jak masz fabryke i przekazujesz ten element (albo caly ExternalModel) i on Ci wypluwa odpowiedni konkretny model InternalModel ktory serializujesz po prostu. Gdy oddzielisz modele external od internal to nie jestes powiazany do zachowania 3rd party (jezeli zmienia cos, to zmieniasz zapewne jedynie external model i fabryke

mozesz tez zrobic to na jednym modelu. Bierzesz to co masz i w zaleznosci od tej flagi dodajesz odpowiedni fragment xml
https://stackoverflow.com/questions/17916788/adding-child-nodes-using-c-sharp-xdocument-class

ale tutaj juz przechowywanie tego jako klasa w C# bedzie wiekszym problemem. Jako, ze obiekt jest dynamiczny

Sam zrobilbym to na dwoch modelach (zapewne trzech + klasa absrakcyjna)

1 użytkowników online, w tym zalogowanych: 0, gości: 1