427 messaggi dal 13 novembre 2009
Salve,
Ho un problema.
Class A
{
Public B b get set
}

Class B
{
Public string stato
}

Public class C: A

Nel metodo get di B.stato devo sapere se B fa parte di una istanza di A o di una istanza di C
In altri termini dentro il metodo get di stato devo sapere se il contenitore padre è A o C
Quindi
A.B.stato = sole se B.stato è contenuto da istanza di A
C.B.stato=Luna se B.stato è contenuto da istanza di C
Dal metodo get in reflection(?) sapere se chi mi contiene è di tipo A o di tipo B
Grazie
Modificato da flaviovb il 05 aprile 2019 18:54 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Flavio,
descrivi bene cosa devi realizzare.

Le classi A, B e C, così come le hai modellate, non possono risolvere il tuo problema perché né la reflection né lo StackTrace ti potranno aiutare.


Nel metodo get di B.stato devo sapere se B fa parte di una istanza di A o di una istanza di C

Bene, quindi B è pensata per essere un componente di un'altra classe. Un modo corretto e pragmatico di modellare questa situazione, è quello di farle ricevere il genitore come parametro del costruttore. Così ti assicuri che B non possa mai essere costruita a meno che non si indichi il suo genitore.
public class B
{
  private readonly A genitore;
  public B(A genitore)
  {
    if (genitore == null) 
    {
      throw new ArgumentNullException(nameof(genitore));
    }
    this.genitore = genitore;
  }
  public string Stato { 
    get {
      return genitore.GetType() == typeof(A) ? "Sole" : "Luna";
    }
  }
}

Dato che C deriva da A, allora potrai fornire indifferentemente un'istanza di C o di A.
Il riferimento al genitore me lo salvo su un campo privato, così che possa accedervi più tardi, dal getter Stato, in cui produrrò la stringa "Sole" o "Luna", in base al tipo di genitore.

Ecco un esempio funzionante:
https://dotnetfiddle.net/cPeorn

ciao,
Moreno

Enjoy learning and just keep making
427 messaggi dal 13 novembre 2009
Devo dire che immaginavo la risposta. Il construttore che assegna padre al figlio. Mi preoccupa il fatto che il mio era un esempio semplice. La cosa è più complessa dovendo andare più in profondità 4 5 o 6 livelli innestati
In pratica dal sottolivello N devo arrivare al primo
Modificato da flaviovb il 05 aprile 2019 20:19 -
11.886 messaggi dal 09 febbraio 2002
Contributi

In pratica dal sottolivello N devo arrivare al primo

Ok, fai in modo che la classe B, che riceve il genitore nel suo costruttore, lo esponga attraverso una proprietà "Genitore" che ha solo il getter. E così fai per le classi su tutti i livelli della gerarchia. A quel punto potrai fare:
var tipoDellAntenato = componente.Genitore.Genitore.Genitore.Genitore.GetType();



Il construttore che assegna padre al figlio.

Sì, io ho usato un costruttore ma puoi anche usare dei metodi per aggiungere oggetti figli tardivamente.
var automobile = new FiatQubo();
var motore = automobile.AggiungiMotore<MotoreMetanoStandard>();
var pistoni = motore.AggiungiPistoni<PistoneStandard>(4);
foreach (var pistone in pistoni)
{
  //Qui risalgo al tipo di auto che sto costruendo, ripercorrendo le proprietà
  //che mi permettono di ottenere un riferimento al genitore
  if (pistone.Motore.Automobile.GetType() == typeof(FiatQubo)) {
    pistone.AggiungiBiella<BiellaSpeciale>();
  } else {
    pistone.AggiungiBiella<BiellaStandard>();
  }
}


ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.